web-dev-qa-db-fra.com

Spring Boot comment lire le fichier de propriétés en dehors du fichier jar

dans mon dossier cible, il y a 2 dossiers, lib et conf. tous les fichiers de propriétés sont placés dans le dossier conf et les fichiers jars dans lib foulder.

avant Spring Spring, nous utilisons la configuration suivante dans spring.xml pour utiliser @value

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

et dans Java comme:

@Value("${name}")

private String name;

mais au démarrage du printemps, je ne sais pas comment faire la même chose dans Java.

j'ai essayé de suivre, mais pas de travail

@Configuration
@PropertySource(value = "classpath:aaa.properties")
public class AppConfig {
    @Bean
    public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
    }
}
16
Benjamin Liu

Je suis un peu dérouté par le titre de la question et la description. J'espère que je ne vous confondre pas encore plus avec mes commentaires.

En général, Spring Boot est TRES très motivé sur la structure du projet ainsi que sur le binaire créé. La méthode recommandée (opinion de la botte de printemps) consiste à construire un bocal avec toutes ses dépendances à l'intérieur (gros bocal). Si vous avez besoin de propriétés de configuration définies en dehors de votre Fat JAR (ou war si c'est ce que vous avez construit), Spring Boot propose de nombreuses options (voir référence 1). J'aime que mes applications pointent vers un fichier externe à l'aide de l'indicateur (spring.config.location), qui peut être défini avec une propriété système:

Java -jar -Dspring.config.location=<path-to-file> myBootProject.jar

Notez que vous pouvez faire quelque chose de similaire en utilisant une variable d'environnement pour définir l'emplacement de votre fichier externe.

J'espère que ça aide!

Références: 1. https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

31
Alberto

Je ne sais pas si vous faites face à la même situation que moi, mais dans mon cas, j'ai un fichier jar et un fichier * .properties en dehors de celui-ci. Ce que j'ai fait pour obtenir le fichier * .properties situé à l'extérieur du fichier jar était le suivant:

@Configuration
public class ApplicationContext {

  @Bean
  public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
    PropertySourcesPlaceholderConfigurer properties = new PropertySourcesPlaceholderConfigurer();
    properties.setLocation(new FileSystemResource("application.properties"));
    properties.setIgnoreResourceNotFound(false);

    return properties;
  }
}

Lorsque je définis l'emplacement du fichier application.properties, j'ai créé l'objet FileSystemResource, qui me permet d'obtenir le fichier properties.files situé à côté du fichier jar. Si vos fichiers . Properties sont dans classpath, par exemple, vous pouvez utiliser d'autres classes (comme ClassPathResource). Vous pouvez lire d'autres classes qui proposent des ressources pour obtenir un objet Resource sous le package org.springframework.core.io..

J'espère que ce commentaire aide.

Comme mentionné dans le documentation de démarrage Spring ,

SpringApplication va charger les propriétés de application.properties fichiers aux emplacements suivants et ajoutez-les à l'environnement Spring:

  1. Un sous-répertoire/config du répertoire en cours.
  2. Le répertoire actuel
  3. Un paquet classpath/config
  4. La racine du classpath

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

Une solution consiste à renommer simplement votre répertoire 'conf' en 'config' et cela fonctionnera sans problème. Il n’est donc pas nécessaire d’effectuer une configuration supplémentaire tant que vous ne voulez pas que votre fichier de propriétés se trouve dans un emplacement autre que celui mentionné ci-dessus.

Dans ce cas, vous pouvez définir explicitement la source de la propriété.

@PropertySource("classpath:config.properties")

et pour plusieurs fichiers de propriétés

@PropertySources({
    @PropertySource("classpath:config.properties"),
    @PropertySource("classpath:logging.properties"),
    @PropertySource(value="classpath:missing.properties", ignoreResourceNotFound=true)
})
8
jayantS

Trouvé une solution:

commencez par créer une classe et ajoutez @ConfigurationProperties

@ConfigurationProperties(prefix = "asdf", locations = "file:conf/aaa.properties")
public class ASDF {
    private String name;   

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

S'il vous plaît noté dans les emplacements, j'utilise le fichier, pas classpath.

puis dans votre classe d'application, ajoutez @EnableConfigurationProperties

@SpringBootApplication
@EnableConfigurationProperties({ASDF.class, BBB.class})
public class InitialBeanTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(InitialBeanTestApplication.class, args);
    }
}

alors vous pouvez lire le fichier de configuration dans le dossier conf

3
Benjamin Liu

Trouvé une autre solution.

placez chaque configuration dans un fichier application.properties et utilisez @Value ("$ {name}") pour lire.

et utilisez un fichier Assembly pour copier le fichier des dossiers de ressources dans le dossier de configuration cible.

et après le déploiement, il suffit de modifier le fichier application.properties dans le dossier config et d’exécuter l’application.

ceci parce que le démarrage de printemps a lu le fichier application.properties dans la séquence suivante.

• Le sous-répertoire/config situé dans le répertoire actuel

• le répertoire en cours

• un package classpath/config

• la racine du classpath

mais cela fonctionne pour un fichier de propriétés. pas pour multiplier les fichiers de propriétés

2
Benjamin Liu

En fait, le moyen le plus simple consiste à placer application.properties Et your.jar Dans le même répertoire, et seul Java -jar your.jar Chargera automatiquement ce fichier de configuration externe.

Et si vous essayez de charger des fichiers de contexte/fichiers à partir du dossier de ressources via ClassPathResource, n'utilisez pas pathResource.getFile() lorsque vous lisez le fichier, mais utilisez plutôt pathResource.getInputStream(), getFile() fonctionne bien dans votre IDE, mais il ne fonctionne pas avec la version autonome jar.

1
Neeson.Z