web-dev-qa-db-fra.com

Comment hériter de application.properties au printemps?

Si je crée une bibliothèque commune ayant un application.properties définissant des configurations communes. Comme:

spring.main.banner-mode=off

Comment puis-je hériter de ces propriétés dans un autre projet où j'inclus ces bibliothèques communes?

Maven:

<project ...>
    <groupId>de.mydomain</groupId>
    <artifactId>my-core</artifactId>
    <version>1.0.0</version>

    <dependencies>
        <dependency>
            <!-- this one holds the common application.properties -->
            <groupId>my.domain</groupId>
            <artifactId>my-commons</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>
</project>

Comment puis-je hériter de la configuration de my-commons à my-core?

8
membersound

La solution consiste à inclure les propriétés partagées sous un nom différent, ici application-shared.properties

En bibliothèque partagée:

@SpringBootApplication
@PropertySource(ResourceUtils.CLASSPATH_URL_PREFIX + "application-shared.properties") //can be overridden by application.properties
public class SharedAutoConfiguration {
}

Dans l'application principale:

@SpringBootApplication
@Import(SharedAutoConfiguration.class)
public class MainAppConfiguration extends SpringBootServletInitializer {

}

De cette façon, la configuration commune/partagée est chargée, mais peut néanmoins être remplacée dans application.properties de l’application principale.

Cela ne fonctionne pas avec la propriété spring.main.banner-mode (je ne sais pas pourquoi), mais avec toutes les autres propriétés, cela a bien fonctionné.

3
membersound

Vous pouvez essayer cela avec Spring.

Vous pouvez définir votre src/main/resources/application.properties dans un module commun comme vous l'avez mentionné. Il sera présent dans classpath pour les autres projets qui en dépendent.

Ensuite, avec Annotation @PropertySource, dans d’autres projets qui dépendent du module commun:

@Configuration
@PropertySource("classpath*:META-INF/spring/properties/*.properties")
public class Config {
  ...
}

Ou avec la configuration XML:

<context:property-placeholder location="classpath*:META-INF/spring/properties/*.properties"/>

Il devrait importer tous les fichiers de configuration du répertoire donne classpath.

En outre, vous devez savoir que vous ne pouvez pas avoir deux mêmes fichiers dans classpath. Vous aurez un conflit.

Par exemple, cette situation générera un conflit :

Projet A (dépend du projet B): 

  • src/main/resources/application.properties

Projet B: 

  • src/main/resources/application.properties

Vous devrez renommer le fichier application.properties ou le placer dans un autre répertoire.

0
Mickael