springboot配置多项目下统一切换不同环境变量profile办法
springboot配置多項目下統(tǒng)一切換不同環(huán)境變量profile辦法
springboot 適合于微服務那種多項目開發(fā),每一個小項目就是一個springboot 項目,比如我們這樣:
問題發(fā)生:
我們知道springboot 項目中的配置文件application.properties ,幾乎我們的配置信息都寫在了這邊,非常方便,但常常我們會多環(huán)境應用,比如開發(fā)環(huán)境 、測試環(huán)境 、正式環(huán)境 等不同的配置信息,前一段時間,對我們公司的一個項目,在多個省進行了部署,我改來改去差點瘋了,同事的提醒,也深刻體會到,如果單用一個配置文件,絕對不行。
配置辦法:
對于上邊的貼出的那個例子,介紹如下:
當然springboot 項目默認為jar ,但是有時候我們也會像上邊一樣,以war 包運行。針對于不同的包類型,我發(fā)現(xiàn)配置是不同的。
1、每一個子項目中創(chuàng)建dev 、product 等多個不同的配置文件
大家這里可能說是不是太麻煩,每個子項目都要配一個,其實是可以都配置到父pom.xml 里的,只不過我嫌看起來不直觀,所以都每個環(huán)境都給搞了一個,后邊我會寫上直接一個配置文件搞定的寫法。
如上圖所示,在兩個子項目springboot-study-rest 、springboot-study-service 中的resources 下,分別都創(chuàng)建application-dev.properties 和application-product.properties 兩個文件。
然后在它們原有的application.properties 文件中都填寫下邊這種配置:
上邊的activatedProperties 會在下邊第二步 中提到。
然后對于dev 、product 的不同環(huán)境下的配置,分別寫到對應的配置文件中即可。
2、父pom 添加profiles
首先找到項目的父pom.xml ,如果你單項目,那就找它自己就行了,找到后,加上如下配置:
<profiles><!-- 默認開發(fā)環(huán)境 --><profile><!--id唯一,不能有重復的--><id>dev</id><!--配置--><properties><!-- 環(huán)境標識,需要與配置文件的名稱相對應 --><activatedProperties>dev</activatedProperties></properties><activation><!-- 默認環(huán)境,如果設置了這個,則項目運行默認使用這個profile的配置 --><activeByDefault>true</activeByDefault></activation></profile><!-- 生產(chǎn)環(huán)境 --><profile><id>product</id><properties><activatedProperties>product</activatedProperties> </properties></profile></profiles>上邊中你會看到在第一步 中配置的那個activatedProperties,它們是一一對應的,并且兩邊添加上@@ 即可。
上邊這段,我是放置在父pom.xml 的下邊這個位置,位置無所謂的:
3、war 包的,子pom 添加resources 如下:
<build><finalName>springboot-study-rest</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><configuration><failOnMissingWebXml>false</failOnMissingWebXml></configuration></plugin></plugins><resources><!-- 打包時將jsp文件拷貝到META-INF目錄下--><resource><!-- 指定resources插件處理哪個目錄下的資源文件 --><directory>src/main/webapp</directory><!--注意此次必須要放在此目錄下才能被訪問到--><targetPath>META-INF/resources</targetPath><includes><include>**/**</include></includes></resource><resource><directory>src/main/resources</directory><includes><include>**/**</include></includes><!--不加這個就會報錯,對于多配置文件的這種,必須設成true--><filtering>true</filtering></resource></resources></build>上邊這段是我把整個pom.xml 里`` 標簽中的東西貼上了,大家可以參照,這里只說resources ,注意下邊有一個:
<filtering>true</filtering>一定要設置成true ,否則項目運行的時候,application.properties 文件中的引用變量值變不過來。
3、jar 包的,子pom 中不需要加resource:
我親自試過,下邊是我的jar包中,pom.xml 中的`` 標簽內(nèi)容:
<build><plugins><!--springboot項目打包必須要帶的--><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>1.5.1.RELEASE</version><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin><!--<plugin>--><!--<groupId>org.apache.maven.plugins</groupId>--><!--<artifactId>maven-compiler-plugin</artifactId>--><!--<version>3.3</version>--><!--<configuration>--><!--<source>1.8</source>--><!--<target>1.8</target>--><!--</configuration>--><!--</plugin>--><!--<plugin>--><!--<groupId>org.apache.maven.plugins</groupId>--><!--<artifactId>maven-war-plugin</artifactId>--><!--<version>2.6</version>--><!--<configuration>--><!--<failOnMissingWebXml>false</failOnMissingWebXml>--><!--</configuration>--><!--</plugin>--></plugins><!--<resources>--><!--<resource>--><!--<directory>src/main/resources</directory>--><!--<includes>--><!--<include>application.properties</include>--><!--</includes>--><!--<filtering>true</filtering>--><!--</resource>--><!--<resource>--><!--<directory>src/main/resources</directory>--><!--<includes>--><!--<include>**/*</include>--><!--</includes>--><!--</resource>--><!--</resources>--> </build>上邊我已經(jīng)把其他東西都注釋掉了,只留下一個plugins 標簽。編譯之后,就可以替換成功。而war 包卻不能那樣,必須要有resources 標簽,并且對其中的filter 設置成true才可以。
到此,可以直接運行項目,如果都出現(xiàn)下邊這行,即配置完成。
如果上圖的位置中還是@activatedProperties@ 說明沒有成功。
下邊說一下一個配置文件搞定的辦法
其實通過以上的配置,大家估計也看出來了,如何只使用一個配置文件,配置除去第一步 ,其他,跟上邊是一樣的,只不過需要把你對于不同環(huán)境的配置信息,都移到了父pom.xml 中即可。
1、配置信息寫到父pom.xml中
<profiles><!-- 默認開發(fā)環(huán)境 --><profile><!--id唯一,不能有重復的--><id>dev</id><!--配置--><properties><!-- 環(huán)境標識,需要與配置文件的名稱相對應 --><restport>8076</restport><serviceport>8089</serviceport><zkHost>http://localhost:8983/solr</zkHost><driverclass>oracle.jdbc.driver.OracleDriver</driverclass></properties><activation><!-- 默認環(huán)境,如果設置了這個,則項目運行默認使用這個profile的配置 --><activeByDefault>true</activeByDefault></activation></profile><!-- 生產(chǎn)環(huán)境 --><profile><id>product</id><properties><restport>30000</restport><serviceport>30001</serviceport><zkHost>http://113.11.11.11:8983/solr</zkHost><driverclass>com.microsoft.sqlserver.jdbc.SQLServerDriver</driverclass></properties></profile></profiles>即把我們的配置,都寫到了每一個profiles下的properties 中了。
2、application.properties 文件引用
springboot-study-rest 項目中的application.properties 文件中如下:
server.port=@restport@ spring.data.solr.zk-host=@zkHost@springboot-study-service項目中的application.properties 文件中如下:
server.port=@serviceport@ spring.datasource.driver-class-name=@driverclass@3、配置完成后,運行項目。
配置完成后,運行項目,因為現(xiàn)在沒有了dev 、product 的properties 文件了,那運行后的日志會是這樣的,即default ,沒關系,意思就是說使用的是application.properties 文件中的內(nèi)容。
4、其他配置參照上邊那種配置方法即可
對于其他的關于各個項目的pom.xml 配置,就參照上邊寫的吧,都一樣了。
這樣看來,下邊的這種配置方式更加簡潔。可能大部分人會更偏向于接受后邊的這種配置。
配置失敗的原因分析
可能我寫的不夠詳細,大家在配置中會遇到失敗的問題,我覺得最可能引起錯誤的原因主要有下邊這幾個:
1、maven 的配置沒有更新,因為我們改了些配置,即需要重新更新下maven 配置即可。
2、項目未編譯 ,如果你配置正確,還沒有啟動成功,十之八九的原因在這里,你只需要對項目重新clean install 即可。即把舊的class文件及配置全部清除掉,再重新編譯打包即可。
3、配置對應的名稱寫錯,不對應 ,即類似于我們在properties 文件中的引用,@@ 之間的內(nèi)容必須與profile 中的properties 標簽中的名字對應,如果錯了就替換不成功的,如果沒有那肯定也是替換不了的。
4、war 包中的resources 下的filter 未設置成true 。
總結
以上是生活随笔為你收集整理的springboot配置多项目下统一切换不同环境变量profile办法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 交通银行签约第四范式,建设全行级统一AI
- 下一篇: 第四范式“金融范”系列分享会第二期开课: