一、啟動時指定環境配置文件
在啟動springboot應用的jar包時,我們可以指定配置文件,通常把配置文件上傳到linux服務器對應jar包的同級目錄,或者統一的配置文件存放目錄
java -jar your-app.jar --spring.config.location=/opt/softs/applications-prod.yaml
實際可以把配置文件路徑spring.config.location后面的替換成你自己的存放路徑,把配置文件放到服務器上可以很方便的隨時修改內容。
以上說的是在啟動jar包的時候指定配置文件,那么如何在maven打jar包的時候同時把指定配置文件打包進去,直接啟動就好了?請看接下來的分析
二、maven多環境打包配置
首先創建一個springboot應用(如果是微服務,且每個服務都是springboot應用的話,都按照同樣的配置即可,筆者這里是為了舉例說明),大概的結構如下
代碼結構不重要,重點是pom文件和配置文件怎么配置
多個配置文件創建
假設現在有三個環境,分別是開發環境、測試環境、生產環境,這也是標準的開發、測試、上線
流程所需要的軟件環境。筆者在src/main/resources下創建了四個配置文件
application.yaml
這個是主配置文件,里面可以配置一些通用和基礎的配置,比如連接數據,mybatis等等
spring:profiles:active: @environment@datasource:# 數據庫連接信息driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/usertest?useSSL=false&serverTimezone=UTCusername: rootpassword: root
mybatis:# MyBatis配置mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.execute.batch.executebatch.mapperconfiguration:map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImpl
也可以只配置如下
spring:profiles:active: @environment@
筆者這里只配置了如下內容,active是使用哪個環境的配置,這里是一個變量,先不管后面再說明
application-dev.yaml
這個是開發環境配置,配置如下
端口號,和數據庫配置,mybatis配置。數據庫配置一般在各個環境使用的都不同,所以應該分別配置到對應環境下的配置文件中。mybatis配置這個一般是不變的,一般可以放在上面的application.yaml主配置文件中,不過筆者這里沒有動了。
開發環境端口號是4455
application-test.yaml
這個是測試環境配置,內容如下
內容同上,只是端口不一樣,為6677
application-prod.yaml
生產環境配置文件
生產環境的端口號是7788
pom文件配置
首先是profiles配置
<profiles><profile><!--不同環境Profile的唯一id--><id>dev</id><!--默認激活dev 環境--><activation><activeByDefault>true</activeByDefault></activation><properties><!--environment是自定義的字段(名字隨便起),自定義字段可以有多個,確保與配置文件一致--><environment>dev</environment></properties></profile><profile><id>prod</id><activation><activeByDefault>false</activeByDefault></activation><properties><environment>prod</environment></properties></profile><profile><id>test</id><activation><activeByDefault>false</activeByDefault></activation><properties><environment>test</environment></properties></profile></profiles>
有三組profile,分別對應三個環境dev、prod、test
注: < e n v i r o n m e n t > d e v < / e n v i r o n m e n t > <environment>dev</environment> <environment>dev</environment>這個environment標簽可以隨意定義,只要application.yaml里面能對應上就行
build配置
<!-- 打包需要引入對應環境的配置文件 --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><!--打包時跳過測試--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>3.1.2</version><configuration><skipTests>true</skipTests></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><executions><execution><id>default-resources</id><phase>package</phase><goals><goal>copy-resources</goal></goals><configuration><outputDirectory>target/classes</outputDirectory><useDefaultDelimiters>false</useDefaultDelimiters><delimiters><delimiter>@</delimiter></delimiters><resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes><filtering>true</filtering></resource><resource><directory>src/main/resources/</directory><filtering>true</filtering><includes><include>**/*.yaml</include></includes></resource><resource><directory>src/main/resources/</directory><excludes><exclude>**/*.yaml</exclude></excludes></resource></resources></configuration></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-antrun-plugin</artifactId><version>1.3</version><executions><execution><id>print-custom-info</id><phase>package</phase><configuration><tasks><!--suppress UnresolvedMavenProperty --><echo message="[INFO] ${environment} 環境打包執行成功"/></tasks></configuration><goals><goal>run</goal></goals></execution></executions></plugin></plugins></build>
有兩個需要注意的點
首先第一個打包時跳過測試的配置
這樣我們在打包生產環境時的命令
mvn clean package -Pprod
而不是下面的,去掉了 -Dmaven.test.skip=true
mvn clean package -Pprod -Dmaven.test.skip=true
第二個分割符解析
這里的配置實際上是為了識別下面配置的@符號,從環境變量中讀取具體哪個環境
注:上面的@符號可以換成其他的符號分割比如*或者&,一般還是不換比較好
三、IDEA啟動調整
以上配置好后,IDEA啟動就無法啟動了,發現無法識別主配置里的自定義變量
這個是我們打包時候用到的,IDEA啟動自然無法識別,打開右側的maven配置,會發現多了幾個配置文件(native 和nativeTest這兩個是maven自己生成的不用管),我們勾選上dev
再次點擊啟動,發現啟動成功了,這個主要是我們自己開發本地測試時使用
當你有使用其他環境,比如使用test環境啟動的需求時,把dev勾選取消,仍然還有灰色的暗勾選,此時maven沒有自動刷新。勾選上test后,點擊左上角的刷新按鈕,就會變成如下界面
再次啟動,就會使用測試環境配置啟動了
四、指定環境打包
有了以上的環境配置準備,我們就可以在打包時指定配置,而不是運行時指定配置環境了,筆者使用的時idea開發,進入terminal控制臺輸入如下命令,打包開發環境配置的jar包
mvn clean package -Pprod
看到打包成功了
五、啟動jar包
windows下使用cmd命令進入打包后的項目target目錄下執行
java -jar execute-batch-0.0.1-SNAPSHOT.jar
啟動成功了,我們的生產環境端口號正是7788
postman調用下接口
到這里maven多環境打包配置完成了
六、完整pom文件
筆者這里附上完整的pom文件內容,可供復制參考,主要是 < b u i l d > < / b u i l d > <build></build> <build></build>和 < p r o f i l e s > < / p r o f i l e s > <profiles></profiles> <profiles></profiles>中的配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.5</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.execute.batch</groupId><artifactId>execute-batch</artifactId><version>0.0.1-SNAPSHOT</version><name>execute-batch</name><description>execute-batch</description><properties><java.version>21</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter-test</artifactId><version>3.0.3</version><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency><dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>2.0.1.Final</version></dependency></dependencies><!-- 打包需要引入對應環境的配置文件 --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><!--打包時跳過測試--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>3.1.2</version><configuration><skipTests>true</skipTests></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><executions><execution><id>default-resources</id><phase>package</phase><goals><goal>copy-resources</goal></goals><configuration><outputDirectory>target/classes</outputDirectory><useDefaultDelimiters>false</useDefaultDelimiters><delimiters><delimiter>@</delimiter></delimiters><resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes><filtering>true</filtering></resource><resource><directory>src/main/resources/</directory><filtering>true</filtering><includes><include>**/*.yaml</include></includes></resource><resource><directory>src/main/resources/</directory><excludes><exclude>**/*.yaml</exclude></excludes></resource></resources></configuration></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-antrun-plugin</artifactId><version>1.3</version><executions><execution><id>print-custom-info</id><phase>package</phase><configuration><tasks><!--suppress UnresolvedMavenProperty --><echo message="[INFO] ${environment} 環境打包執行成功"/></tasks></configuration><goals><goal>run</goal></goals></execution></executions></plugin></plugins></build><profiles><profile><!--不同環境Profile的唯一id--><id>dev</id><!--默認激活dev 環境--><activation><activeByDefault>true</activeByDefault></activation><properties><!--environment是自定義的字段(名字隨便起),自定義字段可以有多個,確保與配置文件一致--><environment>dev</environment></properties></profile><profile><id>prod</id><activation><activeByDefault>false</activeByDefault></activation><properties><environment>prod</environment></properties></profile><profile><id>test</id><activation><activeByDefault>false</activeByDefault></activation><properties><environment>test</environment></properties></profile></profiles></project>