Une histoire lors du développement d'un backend avec SpringBoot.
De nos jours, depuis la sortie de Docker, il y a une tendance à gérer de la combinaison à la production avec un module et une source jusqu'à la fin.
La distinction entre chaque environnement est basée sur la politique de conception consistant simplement à transmettre des arguments d'environnement de l'extérieur. Donc, je vais résumer ce qu'il faut faire avec le module d'application créé avec Spring Boot à l'intérieur
Les informations officielles sont ci-dessous, vous pouvez donc le faire ici. Officiel
Si vous incluez les éléments suivants dans l'argument de démarrage,
-Dspring.profiles.active=dev1
C'est une spécification que les fichiers suivants sont lus.
src/main/resource/application-dev1.properties」
Utilisez la fonction maven pour changer le fichier de configuration lors de la solidification d'un module, en le transformant en bocal ou en guerre. Le moyen le plus simple de changer les fichiers de configuration est de transférer les fichiers au moment de la construction.
pom.xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webappDirectory>${project.build.directory}/${project.build.finalName}</webappDirectory>
<webResources>
<resource>
<directory>${basedir}/release/${project.stage}</directory>
</resource>
</webResources>
<useCache>false</useCache>
<!--Ajouté en raison d'une erreur d'avertissement--> <failOnMissingWebXml>false</failOnMissingWebXml>
<archive>
<manifest>
<!--spécification de la classe principale (si nécessaire)--> <mainClass>jp.co.●●.●●.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<profiles>
<profile>
<id>dev1</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<project.stage>dev01</project.stage>
</properties>
</profile>
<profile>
<id>dev02</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
<properties>
<project.stage>dev02</project.stage>
</properties>
</profile>
</profiles>
Puisqu'il est possible d'incorporer des commandes shell en interne, Pour ceux qui sont habitués aux maven, c'est familier.
Premièrement, la méthode de changement de profil springboot a un format de fichier de propriétés fixe, ce qui rend très difficile la définition de paramètres tels que la lecture de plusieurs fichiers. Il manque de souplesse, surtout lorsque l'environnement augmente.
Deuxièmement, la méthode de commutation de profil maven est un paramètre selon lequel seul un module spécifique fonctionne dans un environnement spécifique lors de la lecture de plusieurs fichiers, donc s'il y a une erreur ou une erreur de procédure dans le shell de déploiement, etc., un échec se produira. La probabilité est élevée.
Utilisez ApplicationContextInitializer pour définir le profil au démarrage.
Spécification de l'argument de démarrage Java → Spécifier dans le profil avec ApplicationContextInitializer Avec cette méthode, vous pouvez regrouper lorsque vous spécifiez le profil. Lorsqu'il est exécuté avec dev01, il peut contenir deux informations, dev et dev01.
java -Dproject.stage=dev01 hoge.war
public class SpringActiveProfileInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
/**Enregistreur*/
private static final Logger LOG = LoggerFactory.getLogger(SpringActiveProfileInitializer.class);
@Override
public void initialize(final ConfigurableApplicationContext applicationContext) {
//Obtenir l'argument de démarrage (dev01)
String projectStage = System.getProperty("project.stage");
//Obtenir le groupe de démarrage (dev)
String prjectStageGroup = projectStage.replaceAll("[0-9]+", "");
ConfigurableEnvironment env = applicationContext.getEnvironment();
if (StringUtils.equals(projectStage, prjectStageGroup)) {
env.setActiveProfiles(projectStage);
} else {
env.setActiveProfiles(prjectStageGroup);
env.addActiveProfile(projectStage);
}
if (LOG.isDebugEnabled()) {
// setting spring.profiles.active = [dev, dev01]
LOG.debug("setting spring.profiles.active = {}", Arrays.asList(env.getActiveProfiles()));
}
}
}
web-fragment.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-fragment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:webfragment="http://xmlns.jcp.org/xml/ns/javaee/web-fragment_3_0.xsd" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-fragment_3_0.xsd"
version="3.0">
<!--Définissez ProjectStage défini dans les paramètres système JVM sur Spring Active Profile-->
<context-param>
<param-name>contextInitializerClasses</param-name>
<param-value>jp.co.future.project.palette.common.context.SpringActiveProfileInitializer</param-value>
</context-param>
</xml>
Le profil peut être décrit même dans xml Les fichiers de définition peuvent être séparés pour chaque environnement
Bien que décrits dans l'exemple, des paramètres tels que la similitude et la lecture de fichiers externes sont également possibles.
<beans profile="dev">
<!--La source de données-->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
<property name="jdbcUrl" value=""/>
</bean>
</beans>
<beans profile="stg">
<!--La source de données-->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
<property name="jdbcUrl" value=""/>
</bean>
</beans>
<!--Plusieurs étapes peuvent être spécifiées en les séparant par des virgules-->
<beans profile="dev,stg">
<bean id="redis" >
</bean>
</beans>
<beans profile="dev01">
<!--Les fichiers de propriétés peuvent également être lus à partir de xml-->
<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="location" value="classpath:config/connect-config-dev01.properties" />
</bean>
</beans>
<!--Il est également possible d'importer le xml lui-même-->
<import resource="classpath:META-INF/common-context.xml" />
Voici comment changer d'environnement avec Spring Boot. Un module, une source!
Recommended Posts