Comment externaliser l'application de démarrage à ressort.propriétés du dossier tomcat/lib

j'ai besoin d'une guerre déployable sans configuration, myapp1.guerre qui permet de récupérer les fichiers de configuration à partir du dossier tomcat/lib. Comme j'ai d'autres applications web coexistant sur le même Tomcat: myapp2.la guerre, myapp3.war, j'ai besoin de cette mise en page:

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

de cette façon je peux construire les fichiers de guerre sans aucun fichier de propriétés à l'intérieur de la guerre et déployer sur n'importe quel serveur.

j'ai lu la documentation de ressort mais il

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

Je ne sais pas comment faire pour le cas de plusieurs fichiers de guerre coexistants.

je voudrais savoir si cela est possible ou si je devrais renoncer à la botte à ressort et revenir aux applications traditionnelles MVC à ressort.

20
demandé sur Daniel Mora 2015-06-24 06:24:58

2 réponses

une solution pourrait être de charger application-{profile}.propriétés comme @PropertySource annotations comme le suggère cette question 151980920, mais le système de journalisation ne fonctionnera pas, comme vous pouvez le voir dans la documentation 151990920 .

le système de journalisation est initialisé au début du cycle de vie de l'application et en tant que tel propriétés d'enregistrement ne sera pas trouvé dans les fichiers de propriétés chargé via @PropertySource annotations.

cela signifie que vos propriétés de journalisation dans application-{profiles}.propriétés comme:

logging.config=classpath:myapp1/logback.xml
logging.path = /path/to/logs
logging.file = myapp1.log

sera ignoré et le système de journalisation ne fonctionnera pas.

pour résoudre ceci j'ai utilisé le SpringApplicationBuilder.propriétés() méthode pour charger les propriétés au début, lorsque l'application est configurée. Là, j'ai mis le " printemps.config.emplacement' utilisé par la botte de ressort pour charger toute l'application-{profils}.propriété:

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;
   }
}

puis j'ai déplacé les fichiers de propriétés de src / main / resources à src/main/resources / myapp1

.
├src
| └main
|   └resources
|     └myapp1
|       └application.properties
|       └application-development.properties
|       └logback.xml
└─pom.xml

dans le pom.xml je dois définir la portée des bibliothèques tomcat intégrées comme "fourni". Aussi, pour exclure tous les fichiers de propriétés dans src/main/resources / myapp1 de la guerre finale et générer une guerre sans configuration, déployable:

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

puis à Tomcat j'ai

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

maintenant je peux générer la guerre libre de configuration et la déposer dans le dossier apache-tomcat-7.0.59/webapps. Les fichiers de propriétés seront résolus en utilisant classpath, indépendamment pour chaque webapp:

   apache-tomcat-7.0.59/lib/myapp1
   apache-tomcat-7.0.59/lib/myapp2
   apache-tomcat-7.0.59/lib/myapp3
28
répondu Daniel Mora 2017-05-23 12:10:01

avec Spring 4.2 et @Annotation config et tomcat sur linux serveur

Première extérioriser dans Dev de l'environnement ( avec eclipse )

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

au lieu de src/main/resources/application-yourapp.properties

alors dans votre classe D'Application n'oubliez pas de configurer la source @PropertySource comme ça:

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

    ...
}

maintenant dans eclipse ajouter votre dossier de configuration à classpath, allez dans "exécuter des Configurations" de votre serveur tomcat (ou l'équivalent ) et ajouter le dossier Config aux entrées utilisateur

enter image description here

Ok c'est ça, votre application.propriétés est hors de l'application et votre projet fonctionne parfaitement dans l'environnement dev.

en production

Maintenant, déployez votre .dossiers de guerre (ou n'importe quoi ) sur tomcat, et mettez votre application-yourrapp.propriétés de toute façon sur votre machine de production. ( par exemple dans /opt/applyconfigfolder/application-yourapp.les propriétés" )

puis dans votre tomcat (ici tomcat 7 ) ouvert bin\catalina.sh

vous avez cette ligne

# 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=

il suffit d'ajouter le chemin du dossier qui contient l'application.propriétés 151980920"

CLASSPATH=:/opt/applyconfigfolder

si vous avez déjà défini un chemin de classe, vous pouvez l'ajouter

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

Je n'ai pas essayé avec windows, mais je pense qu'il n'y a pas de problème

1
répondu amdev 2016-12-16 10:43:00