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 .
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.
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);
}
}
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
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.
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
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 ...)ansible
qui déploieront les scripts Shell
et remplaceront les espaces réservés par la valeur réelle.La priorité de la configuration des ressorts est la suivante.
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.