how deploy context change application app and java tomcat spring-boot maven-3

java - deploy - tomcat and spring boot



Cómo externalizar la aplicación Spring Boot.properties a la carpeta tomcat/lib (2)

Necesito una configuración gratuita, desplegable war, myapp1.war que pueda recuperar los archivos de configuración de la carpeta tomcat / lib. Como tengo otras aplicaciones web que coexisten en el mismo Tomcat: myapp2.war, myapp3.war, necesito este diseño:

tomcat/lib/myapp1/application.properties tomcat/lib/myapp2/application.properties tomcat/lib/myapp3/application.properties

De esta manera puedo construir los archivos de guerra sin ningún archivo de propiedades dentro de la guerra y desplegarlos en cualquier servidor.

He leído la documentación de Spring pero explica cómo configurar la ubicación cuando se ejecuta como un jar:

java -jar myapp.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties

No puedo averiguar cómo hacer esto para el caso de múltiples archivos de guerra coexistentes.

Me gustaría saber si esto es posible o si debo renunciar a Spring Boot y volver a las aplicaciones tradicionales de Spring MVC.


Con Spring 4.2 y @Annotation config y tomcat en linux serveur

Primero exteriorizarlo en entorno Dev (con eclipse).

├src | └main | └ .... └config | └application-yourapp.properties

en lugar de src/main/resources/application-yourapp.properties

Luego, en tu clase de aplicación, no olvides configurar el @PropertySource de esa manera:

@Configuration @EnableWebMvc @PropertySource(value = { "classpath:application-yourapp.properties"}) @ComponentScan(basePackages = "com.yourapp") public class YourAppWebConfiguration extends WebMvcConfigurerAdapter { ... }

Ahora, en eclipse, agregue su carpeta de configuración a la ruta de clase, vaya a "Ejecutar configuraciones" de su servidor Tomcat (o equivalente) y agregue la carpeta Configuración a las entradas de usuario

Ok, eso es todo, tu application.properties está fuera de la aplicación y tu proyecto se ejecuta perfectamente en el entorno dev.

En producción

Ahora, 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 su tomcat (aquí tomcat 7) abra bin/catalina.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=

Solo agregue la ruta de la carpeta que contiene application.properties

CLASSPATH=:/opt/applyconfigfolder

Si ya tienes algún classpath definido puedes agregarlo

CLASSPATH=:/opt/applyconfigfolder:/yourpath1:/yourpath2:

No he probado con windows pero creo que no hay problema


Una solución podría ser cargar application- {profile} .properties como anotaciones de @PropertySource como sugiere esta question , pero luego el sistema de registro no funcionará, como puede ver en la documentation .

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} .properties 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 archivo pom.xml tengo que establecer el alcance de las bibliotecas Tomcat incrustadas como "proporcionadas". Además, para excluir todos los archivos de propiedades en src / main / resources / myapp1 de la guerra final y generar una configuración de guerra gratuita, desplegable:

<plugin> <artifactId>maven-war-plugin</artifactId> <version>2.6</version> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> <packagingExcludes> **/myapp1/ </packagingExcludes> </configuration> </plugin>

Luego en Tomcat tengo

├apache-tomcat-7.0.59 └lib ├─myapp1 | └application.properties | └logback.xml └─myapp2 └application.properties └logback.xml

Ahora puedo generar la guerra libre de configuración y colocarla en la carpeta apache-tomcat-7.0.59 / webapps. Los archivos de propiedades se resolverán utilizando el classpath, de forma independiente 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