Saltar al contenido

Cómo externalizar las propiedades de la aplicación Spring Boot a la carpeta tomcat / lib

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

ingrese la descripción de la imagen aquí

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

en el mismo directorio tomcat / lib:

    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:


    

Puntuaciones y reseñas

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *