[JAVA] Changer d'environnement avec l'argument de démarrage dans SpringBoot

introduction

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

Si le nombre d'environnements est petit

Vous pouvez changer avec le profil de Spring Boot.

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」


Changer les fichiers de propriétés lors de la construction

Changement de profil facile de maven.

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.

Je veux changer d'environnement avec un module

Problèmes jusqu'à présent

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 l'extension de profil de démarrage à ressort.

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 de démarrage à ressort est également disponible en 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" />

en conclusion

Voici comment changer d'environnement avec Spring Boot. Un module, une source!

Recommended Posts

Changer d'environnement avec l'argument de démarrage dans SpringBoot
Créez des projets Spring Boot par environnement avec Gradle
Changer d'environnement avec Spring Boot application.properties et l'annotation @Profile
Comment démarrer par environnement avec Spring Boot de Maven
Rendre l'environnement SpringBoot1.5 + Gradle4.4 + Java8 + Docker compatible avec Java11
Créer un environnement Spring Boot avec Windows + VS Code
Créer un environnement de développement Spring Boot avec docker
SSO avec GitHub OAuth dans l'environnement Spring Boot 1.5.x
Création d'un environnement de base de données avec Docker dans Spring Boot (IntellJ)
Environnement de développement-développement Spring Boot-
Changer java avec direnv
Prend en charge le multi-port avec SpringBoot
Télécharger avec Spring Boot
Changez la cible d'injection pour chaque environnement avec Spring Boot 2