web-dev-qa-db-fra.com

Comment substituer application.properties lors de la production dans Spring-Boot?

J'utilise spring boot et application.properties pour sélectionner une base de données lors du développement par @Configuration @Profile("dev").

spring.profiles.active=dev
spring.config.location=file:d:/application.properties

Pendant la production, j'aimerais créer un fichier en dehors du contexte de l'application qui devrait être chargé, puis activer un profil de configuration différent, avec d: /application.properties:

spring.profiles.active=production

Résultat: lorsque je lance l'application, la configuration est toujours dev, de sorte que l'emplacement supplémentaire du fichier de propriétés productives n'est pas pris en compte. Est-ce que je manque quelque chose?

spring boot 1.1.0.BUILD-SNAPSHOT

Remarque: cette question estPASà propos de Tomcat .

32
membersound

Je sais que vous avez demandé comment faire cela.

Mais la réponse est que vous ne devriez pas faire cela.

Vous pouvez avoir application.properties application-default.properties application-dev.properties etc.

vous pouvez changer de profil en utilisant des arguments en ligne de commande sur jvm

vous pouvez remplacer certaines choses au moment du test en utilisant @TestPropertySource

Idéalement, tout devrait être dans le contrôle de code source afin d'éviter les surprises. Comment savoir quelles propriétés se trouvent sur l'emplacement de votre serveur et quelles sont les propriétés manquantes? Qu'advient-il si les développeurs introduisent de nouvelles choses.

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

Spring Boot vous donne déjà suffisamment de moyens de le faire correctement.

10
Kalpesh Soni

Vous pouvez également utiliser @PropertySources

@PropertySources({
        @PropertySource(value = "classpath:application.properties"),
        @PropertySource(value = "file:/user/home/external.properties", ignoreResourceNotFound = true)
})
public class Application {
    public static void main(String[] args) throws Exception {
        ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);

    }


}
10
Saurabh

Je ne suis pas sûr que vous puissiez changer de profil de manière dynamique.

Pourquoi ne pas simplement avoir un fichier de propriétés internal avec la propriété spring.config.location définie sur votre emplacement extérieur souhaité, et le fichier de propriétés situé à cet emplacement (en dehors du fichier jar) porte le spring.profiles Jeu de propriétés .active?

Mieux encore, ayez un fichier de propriétés interne, spécifique au profil dev (a spring.profiles.active = dev) et laissez-le ainsi, et lorsque vous souhaitez déployer en production, spécifiez un nouvel emplacement pour votre fichier de propriétés, qui a spring .profiles.active = prod:

Java -jar myjar.jar --spring.config.location=D:\wherever\application.properties
7
Gabriel Ruiu

UPDATE: C'est un bug au printemps voir ici

les propriétés de l'application situées en dehors de votre pot doivent se trouver dans l'un des emplacements suivants, tout devrait alors fonctionner.

21.2 Application property files
SpringApplication will load properties from application.properties files in the following    locations and add them to the Spring Environment:

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

donc par exemple cela devrait fonctionner, lorsque vous ne voulez pas spécifier d'arguments de ligne cmd et que vous n'utilisez pas spring.config.location dans votre app.props de base:

d:\yourExecutable.jar
d:\application.properties

or

d:\yourExecutable.jar
d:\config\application.properties

voir Spring Config Doc

Mise à jour: Vous pouvez utiliser\@Configuration avec\@PropertySource . Conformément à la doc ici vous pouvez spécifier des ressources n'importe où. vous devez juste faire attention, quand la configuration est chargée pour vous assurer que votre production gagne.

4
dasAnderl ausMinga

J'ai trouvé ce qui suit a fonctionné pour moi:

Java -jar my-awesome-Java-prog.jar --spring.config.location=file:/path-to-config-dir/

avecfile:ajouté.

TARD EDIT

Bien sûr, cette ligne de commande est jamais exécutée telle quelle en production.

J'ai plutôt 

  • [éventuellement plusieurs couches de] Shell scripts dans le contrôle de source avec des espaces réservés pour toutes les parties de la commande susceptibles de changer (nom du fichier jar, chemin d'accès à la configuration ...)
  • Des scripts de déploiement ansible qui déploieront les scripts Shell et remplaceront les espaces réservés par la valeur réelle.
1
avi.elkharrat

La priorité de la configuration des ressorts est la suivante.

  1. Paramètre init ServletConfig
  2. Paramètre init ServletContext
  3. Attributs JNDI 
  4. System.getProperties ()

Donc, votre configuration sera remplacée par la ligne de commande si vous souhaitez le faire. Mais il est recommandé d'éviter de remplacer, bien que vous puissiez utiliser plusieurs profils.

0
Himadri Mandal