Buscamos en distintos espacios y de esta manera traerte la solución a tu duda, en caso de alguna inquietud puedes dejar tu inquietud y contestamos porque estamos para ayudarte.
Solución:
Una solución podría ser cargar la aplicación- perfil .properties como anotaciones @PropertySource como sugiere esta pregunta, pero luego el sistema de registro no funcionará, como puede ver en la documentación.
El sistema de registro se inicializa al principio del ciclo de vida de la aplicación y, como tal, las propiedades de registro no se encontrarán en los archivos de propiedades cargados a través de las anotaciones de @PropertySource.
Esto significa que sus propiedades de registro en la aplicación- perfiles .propiedades como:
logging.config=classpath:myapp1/logback.xml
logging.path = /path/to/logs
logging.file = myapp1.log
será ignorado y el sistema de registro no funcionará.
Para resolver esto, he usado el método SpringApplicationBuilder.properties () para cargar propiedades al principio, cuando la aplicación está configurada. Allí configuré el ‘spring.config.location’ utilizado por Spring Boot para cargar todas las aplicaciones- perfiles .properties:
public class Application extends SpringBootServletInitializer
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder springApplicationBuilder)
return springApplicationBuilder
.sources(Application.class)
.properties(getProperties());
public static void main(String[] args)
SpringApplicationBuilder springApplicationBuilder = new SpringApplicationBuilder(Application.class)
.sources(Application.class)
.properties(getProperties())
.run(args);
static Properties getProperties()
Properties props = new Properties();
props.put("spring.config.location", "classpath:myapp1/");
return props;
Luego moví los archivos de propiedades de src / main / resources a src / main / resources / myapp1
.
├src
| └main
| └resources
| └myapp1
| └application.properties
| └application-development.properties
| └logback.xml
└─pom.xml
En el pom.xml tengo que establecer el alcance de las bibliotecas tomcat incrustadas como “proporcionado”. Además, para excluir todos los archivos de propiedades en src / main / resources / myapp1 de la guerra final y generar una guerra desplegable y sin configuración:
maven-war-plugin
2.6
false
**/myapp1/
Entonces en Tomcat tengo
├apache-tomcat-7.0.59
└lib
├─myapp1
| └application.properties
| └logback.xml
└─myapp2
└application.properties
└logback.xml
Ahora puedo generar la configuración libre de guerra y colocarla en la carpeta apache-tomcat-7.0.59 / webapps. Los archivos de propiedades se resolverán utilizando la ruta de clase, independientemente para cada aplicación web:
apache-tomcat-7.0.59/lib/myapp1
apache-tomcat-7.0.59/lib/myapp2
apache-tomcat-7.0.59/lib/myapp3
Con Spring 4.2 y @Annotation config y tomcat en linux serveur
En su clase de aplicación, configure @PropertySource así:
@Configuration
@EnableWebMvc
@PropertySource(value = "classpath:application-yourapp.properties")
@ComponentScan(basePackages = "com.yourapp")
public class YourAppWebConfiguration extends WebMvcConfigurerAdapter
...
Ahora solo necesita incluir el archivo de propiedades en su classpath
En producción
Implemente sus archivos .war (o cualquier cosa) en tomcat y coloque su application-yourapp.properties de todos modos en su máquina de producción. (por ejemplo en /opt/applyconfigfolder/application-yourapp.properties “)
Luego en tu tomcat (aquí tomcat 7) abre bincatalina.sh
Tienes esta linea
# Ensure that any user defined CLASSPATH variables are not used on startup,
# but allow them to be specified in setenv.sh, in rare case when it is needed.
CLASSPATH=
Simplemente agregue la ruta de la carpeta que contiene application.properties
CLASSPATH=:/opt/applyconfigfolder
Si ya tiene alguna ruta de clase definida, puede agregarla
CLASSPATH=:/opt/applyconfigfolder:/yourpath1:/yourpath2:
No lo he probado con windows pero creo que no hay problema
En desarrollo (con eclipse)
├src
| └main
| └ ....
└config
| └application-yourapp.properties
en lugar de src/main/resources/application-yourapp.properties
Ahora, en eclipse, agregue su carpeta de configuración a classpath, vaya a “Ejecutar configuraciones” de su servidor tomcat (o equivalente) y agregue la carpeta Config a las entradas de usuario
Ok, eso es todo, su application.properties está fuera de la aplicación y su proyecto se ejecuta perfectamente en el entorno de desarrollo.
Daniel Mora dio una buena solución, pero en lugar de usar spring.config.location, puede usar spring.config.name (https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features- external-config.html # boot-features-external-config-application-property-files), por lo que puede tener diferentes archivos de propiedades para diferentes aplicaciones web
public class Application extends SpringBootServletInitializer
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder springApplicationBuilder)
return springApplicationBuilder
.sources(Application.class)
.properties(getProperties());
public static void main(String[] args)
SpringApplicationBuilder springApplicationBuilder = new SpringApplicationBuilder(Application.class)
.sources(Application.class)
.properties(getProperties())
.run(args);
static Properties getProperties()
Properties props = new Properties();
props.put("spring.config.name", "myapp1");
return props;
Creo que el directorio lib es para bibliotecas de terceros, no para almacenar propiedades de configuración para sus aplicaciones web. Entonces creo que una mejor solución es agregar una carpeta externa como carpeta de ruta de clase adicional usando la propiedad shared.loader en conf / catalina.properties:
shared.loader = $ catalina.base / shared / configurations
Puede poner las propiedades de su aplicación app1.properties, app2.properties, ecc .. en apache-tomcat-7.0.59 / shared / configurations.
Antes de encontrar la solución de Daniel Mora de anular el método configure de SpringBootServletInitializer, mi solución fue agregar un context.xml en src / main / webapp / META-INF con este contenido: