web-dev-qa-db-fra.com

Comment externaliser application.properties sur le serveur Web Tomcat pour Spring?

SpringApplication chargera les propriétés de application.properties fichiers aux emplacements suivants et ajoutez-les à Spring Environnement:

- A /config subdirectory of the current directory.
- The current directory
- A classpath /config package
- The classpath root

La liste est triée par ordre de priorité (les propriétés définies dans les emplacements Plus haut dans la liste remplacent celles définies dans les emplacements inférieurs).

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-application-property-files

Question: lors de l’exécution d’un fichier war sur un serveur Tomcat: comment puis-je ajouter un emplacement supplémentaire pour le application.propertiesextérieur du chemin de classe ou du conteneur Tomcat, tel que d:\application.properties?

L'emplacement personnalisé doit être prioritaire sur les emplacements ci-dessus.

Le problème est que je pourrais bien sûr ajouter un dossier /config à l'intérieur de ma guerre éclatée dans le dossier Tomcat webapps, mais je perdrais alors toute configuration personnalisée si le dossier webapps était nettoyé et que war était redéployé.

Je voudrais donc ajouter un emplacement supplémentaire à l'extérieur.

12
membersound

Vous pouvez définir une variable d'environnement spring_config_location pointant vers le dossier contenant votre fichier application.properties. 

Dans le cas de Tomcat, vous pouvez le faire en ajoutant la ligne suivante à votre fichier <Tomcat_HOME>/bin/setenv.sh (créez le fichier s'il est manquant):

export spring_config_location=/usr/local/Tomcat/conf/

Placez le fichier de propriétés dans ce dossier. Si vous avez plusieurs applications, vous pouvez définir le nom du fichier de propriétés de chaque application comme unique. Pour une application Spring Boot, je l'ai fait comme ceci:

@SpringBootApplication
public class MyApplication {

    public static void main(String[] args) {
        System.setProperty("spring.config.name", "my-app");
        SpringApplication.run(MyApplication.class, args);
    }
}

Cela sélectionnera le nouveau nom lorsqu’il sera exécuté avec BOOT. Pour que le nom soit également configuré lors du déploiement sur Tomcat, écrasez la configuration de SpringBootServletInitializer comme suit:

public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(MyApplication.class).properties("spring.config.name: my-app");
    }

}

Ensuite, nommez votre fichier de propriétés comme suit: my-app.properties. Au lieu du nom par défaut, Spring cherchera cela. Vous pouvez placer tous les fichiers de propriétés de vos applications dans le dossier spécifié, /usr/local/Tomcat/conf/, dans notre exemple. Vos propriétés externes auront la priorité. Voir ici pour les priorités: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

9
Vladimir Mitev

Pour moi, le moyen le plus simple de le faire était de placer un fichier de contexte dans le dossier de configuration de Tomcat. Par exemple, si votre application est exécutée sous le chemin racine (par exemple, http://your_domain.com/), vous devez créer un fichier [path_to_your_Tomcat]/conf/Catalina/localhost/ROOT.xml. Si votre application s'exécute dans un chemin différent, par exemple http://your_domain.com/example_path, le fichier doit porter le nom suivant: [path_to_your_Tomcat]/conf/Catalina/localhost/example_path.xml. Dans ce fichier, vous pouvez spécifier un chemin d'accès au fichier externe application.properties pouvant être placé n'importe où sur votre disque dur.

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <Environment name="spring.config.location" value="file:/path/to/your/application/properties/file/" type="Java.lang.String"/>
</Context>
9
Grzegorz B.

J'ai dû le faire plusieurs fois et la meilleure approche que j'ai trouvée consiste à configurer un répertoire externe en tant que ressource de chemin de classe dans le conteneur:

 Tomcat classpath

Ensuite, dans le répertoire, placez les ressources que vous souhaitez externaliser et tout fonctionnera correctement. Pour charger la ressource au printemps, vous pouvez procéder comme suit:

<beans:bean id="externalProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <beans:property name="location" value="classpath:[my-application-name]/applicationProperties.properties" />
            <beans:property name="placeholderPrefix" value="!applicationProperties{" />
            <beans:property name="placeholderSuffix" value="}" />
        </beans:bean>

Vous pouvez constater que, comme vous avez indiqué que vous souhaitiez peut-être déployer plusieurs applications dans chaque Tomcat, vous pouvez simplement créer une structure de répertoires dans le dossier que vous avez défini dans classpath afin de conserver un code application.properties différent pour chacune de vos applications war.

 enter image description here

Au cas où vous souhaiteriez maintenir la section du nom de l’application dans votre configuration Spring sous forme dinamicale, vous pouvez le faire de différentes manières, lors de l’emballage dans maven ou même à l’aide du chemin de contexte de l’application.

1
jlumietu

J'ai finalement ajouté la propriété suivante pour externaliser, par exemple, les propriétés sécurisées:

spring.config.additional-location=/etc/Tomcat/<appname>/application-production.properties

0
membersound