[JAVA] Wechseln Sie die Umgebung mit dem Boot-Argument in SpringBoot

Einführung

Eine Geschichte bei der Entwicklung eines Backends mit SpringBoot.

Seit Docker herauskommt, besteht heutzutage die Tendenz, von der Kombination bis zur Produktion mit einem Modul und einer Quelle bis zum Ende zu arbeiten.

Die Unterscheidung zwischen den einzelnen Umgebungen basiert auf der Entwurfspolitik, einfach Umgebungsargumente von außen zu übergeben. Daher werde ich zusammenfassen, was mit dem Anwendungsmodul zu tun ist, das mit Spring Boot erstellt wurde

Wenn die Anzahl der Umgebungen gering ist

Sie können mit dem Profil von Spring Boot wechseln.

Die offiziellen Informationen finden Sie weiter unten. Sie können dies hier tun. Offiziell

Wenn Sie Folgendes in das Startargument aufnehmen,

-Dspring.profiles.active=dev1


Es ist eine Spezifikation, dass die folgenden Dateien gelesen werden.

src/main/resource/application-dev1.properties」


Wechseln Sie die Eigenschaftendateien beim Erstellen

Einfaches Profilwechsel des Maven.

Verwenden Sie die Maven-Funktion, um die Einstellungsdatei zu wechseln, wenn Sie ein Modul verfestigen und es in ein Glas oder einen Krieg verwandeln. Der einfachste Weg, um Konfigurationsdateien zu wechseln, besteht darin, Dateien zur Erstellungszeit zu übertragen.

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>
<!--Wegen Warnfehler hinzugefügt-->					<failOnMissingWebXml>false</failOnMissingWebXml>
		<archive>
			<manifest>
<!--Hauptklassenspezifikation (falls erforderlich)-->							<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>

Da es möglich ist, Shell-Befehle intern zu integrieren, Für diejenigen, die an Maven gewöhnt sind, ist es bekannt.

Ich möchte die Umgebung mit einem Modul wechseln

Probleme bisher

Erstens hat die Springboot-Profilumschaltmethode ein festes Eigenschaftendateiformat, was es sehr schwierig macht, Einstellungen wie das Lesen mehrerer Dateien vorzunehmen. Es mangelt an Flexibilität, insbesondere wenn die Umgebung zunimmt.

Zweitens ist die Umschaltmethode für das Maven-Profil eine Einstellung, bei der nur ein bestimmtes Modul in einer bestimmten Umgebung funktioniert, wenn mehrere Dateien gelesen werden. Wenn also ein Fehler oder ein Prozedurfehler in der Bereitstellungsshell usw. auftritt, tritt ein Fehler auf. Die Wahrscheinlichkeit ist hoch.

Verwenden Sie die Federstiefelprofilverlängerung.

Verwenden Sie ApplicationContextInitializer, um das Profil beim Start festzulegen.

Spezifikation des Java-Startarguments → Mit ApplicationContextInitializer im Profil angeben Mit dieser Methode können Sie gruppieren, wenn Sie das Profil angeben. Bei Ausführung mit dev01 kann es zwei Informationen enthalten, dev und dev01.

java -Dproject.stage=dev01 hoge.war

public class SpringActiveProfileInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
	/**Logger*/
	private static final Logger LOG = LoggerFactory.getLogger(SpringActiveProfileInitializer.class);

	@Override
	public void initialize(final ConfigurableApplicationContext applicationContext) {

		//Startargument abrufen (dev01)
		String projectStage = System.getProperty("project.stage");

		//Bootgruppe abrufen (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">
	<!--Setzen Sie ProjectStage in den JVM-Systemparametern auf 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>

Das Spring Boot-Profil ist auch in XML verfügbar

Das Profil kann sogar in XML beschrieben werden Definitionsdateien können für jede Umgebung getrennt werden

Obwohl im Beispiel beschrieben, sind Einstellungen wie Gemeinsamkeit und Lesen externer Dateien ebenfalls möglich.


	<beans profile="dev">
		<!--Datenquelle-->
		<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
			<property name="jdbcUrl" value=""/>
		</bean>
	</beans>

	<beans profile="stg">
		<!--Datenquelle-->
		<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
			<property name="jdbcUrl" value=""/>
		</bean>
	</beans>

	<!--Es können mehrere Stufen angegeben werden, indem sie durch Kommas getrennt werden-->
	<beans profile="dev,stg">
		<bean id="redis" >
		</bean>
	</beans>


	<beans profile="dev01">
		<!--Eigenschaftendateien können auch aus XML gelesen werden-->
		<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
		    <property name="location" value="classpath:config/connect-config-dev01.properties" />
		</bean>
	</beans>

	<!--Es ist auch möglich, die XML selbst zu importieren-->
	<import resource="classpath:META-INF/common-context.xml" />

abschließend

So wechseln Sie die Umgebung mit Spring Boot. Ein Modul, eine Quelle!

Recommended Posts

Wechseln Sie die Umgebung mit dem Boot-Argument in SpringBoot
Erstellen Sie mit Gradle Spring Boot-Projekte nach Umgebung
Wechseln Sie die Umgebung mit Spring Boot application.properties und @ Profile-Annotation
Booten nach Umgebung mit Spring Boot of Maven
Machen Sie die SpringBoot1.5 + Gradle4.4 + Java8 + Docker-Umgebung mit Java11 kompatibel
Erstellen Sie eine Spring Boot-Umgebung mit Windows + VS-Code
Erstellen Sie mit Docker eine Spring Boot-Entwicklungsumgebung
SSO mit GitHub OAuth in der Spring Boot 1.5.x-Umgebung
Erstellen einer Datenbankumgebung mit Docker in Spring Boot (IntellJ)
Spring Boot Entwicklung-Entwicklungsumgebung-
Schalten Sie Java mit direnv
Unterstützt Multi-Port mit SpringBoot
Mit Spring Boot herunterladen
Ändern Sie das Injektionsziel für jede Umgebung mit Spring Boot 2