J'ai une application print-boot que je veux exécuter avec un fichier de configuration externe . Quand je l'exécute en tant que jar (avec le conteneur de servlets intégré), tout va bien . Mais je veux l'exécuter sous un conteneur de servlets externe (Tomcat) et ici j'ai un problème avec la configuration externe. J'ai essayé un @PropertySource, mais dans ce cas, l'application n'obtient que des propriétés absentes de la configuration du fichier war: la configuration externe ne remplace pas la configuration interne . Alors la question: comment configurer une configuration externe qui remplacera la configuration interne?
Vous utilisez probablement une configuration externe sous la forme application.properties
dans le répertoire actuel lorsque vous exécutez votre application en tant que jar. Cependant, "répertoire actuel" n'est pas très utile lors d'un déploiement en tant que guerre dans un Tomcat externe. Même si vous découvrez le répertoire actuel, il s'agit probablement du même emplacement pour toutes les applications exécutées dans Tomcat. Ainsi, lorsque vous exécutez plusieurs applications, cela ne fonctionnera pas très bien.
Ce que nous faisons ici est de déclarer deux PropertySources
dans notre application:
@PropertySources({@PropertySource(value={"classpath:internal.properties"}), @PropertySource(value={"file:${application.properties}"})})
internal.properties
contient les valeurs par défaut "intégrées" des propriétés. La seconde PropertySource
est un fichier contenant une configuration externe. Notez que le nom du fichier est lui-même une propriété.
Nous définissons cela en externe dans l'élément Context
de notre application (dans Tomcat):
<Context docBase="/path/to/your/war/your.war">
<Parameter name="application.properties" value="/path/to/your/properties/application.properties"/>
</Context>
Cela vous permet d'exécuter plusieurs applications dans Tomcat, chaque application utilisant son propre fichier de propriétés externe. Vous pouvez même avoir plusieurs instances de l'application same s'exécutant avec des propriétés différentes.
Pour externaliser le fichier application.properties Spring Boot lors du déploiement en tant que fichier war, vous pouvez définir spring.config.location
au début de la configuration de l'application Spring Boot:
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;
}
Pour plus de détails, consultez cette solution .
Offre Spring Boot Plusieurs façons pour spécifier l'emplacement de vos propriétés, il n'est pas nécessaire de modifier vos sources.
Vous pouvez définir la valeur spring.config.location par exemple:
Dans vos descripteurs de contexte Tomcat/conf/Catalina/<Host>
:
<Context>
<Parameter name="spring.config.location" value="/path/to/application.properties" />
</Context>
En tant que paramètre JVM dans votre fichier Tomcat setenv.sh
:
-Dspring.config.location=/path/to/application.properties
En tant que variable d'environnement SPRING_CONFIG_LOCATION
.
Vous pouvez ajouter un dossier de fichiers de configuration dans set Classpath line catalina.bat, catalina.sh (lequel si vous voulez utiliser.) Ou vous pouvez ajouter au fichier setenv.bat/sh. Vos fichiers de configuration seront ajoutés à war classpath.
Par exemple;
Dans Windows env.
set CLASSPATH=D:\app\conf