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.
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
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
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