Maven專案屬性與版本管理
Maven專案屬性與版本管理
將介紹兩個內容,分別是
- 屬性
- 版本管理
1. 屬性
1.1 問題分析
我們先來分析一下問題:
前面在父工程中的dependencyManagement標籤中對專案中所使用的jar包版本進行了統一的管理,但是如果在標籤中有如下的內容:
你會發現,如果我們現在想更新Spring的版本,你會發現我們依然需要更新多個jar包的版本,這樣的話還是有可能出現漏改導致程式出問題,而且改起來也是比較麻煩。
問題清楚後,我們需要解決的話,就可以參考變數,宣告一個變數,在其他地方使用該變數,當變數的值發生變化後,所有使用變數的地方,就會跟著修改,即:
1.2 解決步驟
步驟1:父工程中定義屬性
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <spring.version>5.2.12.RELEASE</spring.version> <javax.servlet.api>3.1.0</javax.servlet.api> <mybatis>3.5.10</mybatis> <mysql.connector.java>8.0.30</mysql.connector.java> <jackson.databind>2.9.8</jackson.databind> <mybatis.spring>2.0.7</mybatis.spring> <druid>1.2.11</druid> <lombok>1.18.24</lombok> <junit>4.13.2</junit> </properties>
步驟2:修改依賴的version
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>${javax.servlet-api.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql-connector-java.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson-databind.version}</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>${mybatis-spring.version}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>${druid.version}</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> <scope>provided</scope> </dependency> </dependencies> <!--定義依賴管理--> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement>
此時,我們只需要更新父工程中properties標籤中所維護的jar包版本,所有子專案中的版本也就跟著更新。當然除了將spring相關版本進行維護,我們可以將其他的jar包版本也進行抽取,這樣就可以對專案中所有jar包的版本進行統一維護,如:
<!--定義屬性-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.2.12.RELEASE</spring.version>
<javax.servlet-api.version>3.1.0</javax.servlet-api.version>
<mybatis.version>3.5.10</mybatis.version>
<mysql-connector-java.version>8.0.30</mysql-connector-java.version>
<jackson-databind.version>2.9.8</jackson-databind.version>
<mybatis-spring.version>2.0.7</mybatis-spring.version>
<druid.version>1.2.11</druid.version>
<lombok.version>1.18.24</lombok.version>
<junit.version>4.13.2</junit.version>
</properties>
2. 配置檔案載入屬性
Maven中的屬性我們已經介紹過了,現在也已經能夠通過Maven來集中管理Maven中依賴jar包的版本。但是又有新的需求,就是想讓Maven對於屬性的管理範圍能更大些,比如我們之前專案中的jdbc.properties
,這個配置檔案中的屬性,能不能也來讓Maven進行管理呢?
答案是肯定的,具體的實現步驟為:
步驟1:父工程定義屬性
<properties>
<jdbc.url>jdbc:mysql://localhost:3306/mybatis</jdbc.url>
<jdbc.driver>com.mysql.cj.jdbc.Driver</jdbc.driver>
<jdbc.username>root</jdbc.username>
<jdbc.password>root</jdbc.password>
</properties>
步驟2:jdbc.properties檔案中引用屬性
在jdbc.properties,將jdbc.url的值直接獲取Maven配置的屬性
jdbc.driver=${jdbc.driver}
jdbc.url=${jdbc.url}
jdbc.username=${jdbc.username}
jdbc.password=${jdbc.password}
步驟3:設定maven過濾檔案範圍
Maven在預設情況下是從當前專案的src\main\resources
下讀取檔案進行打包。現在我們需要打包的資原始檔是在maven_02_ssm下,需要我們通過配置來指定下具體的資源目錄。
<build>
<resources>
<!--設定資源目錄-->
<resource>
<directory>../maven_02_ssm/src/main/resources</directory>
<!--設定能夠解析${},預設是false -->
<filtering>true</filtering>
</resource>
</resources>
</build>
說明:directory路徑前要新增../
的原因是maven_02_ssm相對於父工程的pom.xml路徑是在其上一層的目錄中,所以需要新增。
修改完後,注意maven_02_ssm專案的resources目錄就多了些東西,如下:
步驟4:測試是否生效
測試的時候,只需要將maven_02_ssm專案進行打包,然後觀察打包結果中最終生成的內容是否為Maven中配置的內容。
上面的屬性管理就已經完成,但是有一個問題沒有解決,因為不只是maven_02_ssm專案需要有屬性被父工程管理,如果有多個專案需要配置,該如何實現呢?
方式一:
<build>
<resources>
<!--設定資源目錄,並設定能夠解析${}-->
<resource>
<directory>../maven_02_ssm/src/main/resources</directory>
<filtering>true</filtering>
</resource>
<resource>
<directory>../maven_03_ssm_pojo/src/main/resources</directory>
<filtering>true</filtering>
</resource>
...
</resources>
</build>
可以配,但是如果專案夠多的話,這個配置也是比較繁瑣
方式二:
<build>
<resources>
<!--
${project.basedir}: 當前專案所在目錄,子專案繼承了父專案,
相當於所有的子專案都添加了資源目錄的過濾
-->
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
說明:打包的過程中如果報如下錯誤:
原因就是Maven發現你的專案為web專案,就會去找web專案的入口web.xml[配置檔案配置的方式],發現沒有找到,就會報錯。
解決方案1:在maven_02_ssm專案的src\main\webapp\WEB-INF\
新增一個web.xml檔案
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
</web-app>
解決方案2:配置maven打包war時,忽略web.xml檢查
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
上面我們所使用的都是Maven的自定義屬性,除了${project.basedir},它屬於Maven的內建系統屬性。
在Maven中的屬性分為:
- 自定義屬性(常用)
- 內建屬性
- Setting屬性
- Java系統屬性
- 環境變數屬性
屬性分類 | 引用格式 | 示例 |
---|---|---|
自定義屬性 | ${自定義屬性名} | ${spring.version} |
內建屬性 | ${內建屬性名} | ${basedir}、${version} |
Setting屬性 | ${Setting.屬性名} | ${settings.localRepository} |
Java系統屬性 | ${系統屬性分類.系統屬性名} | ${user.home} |
環境變數屬性 | ${env.環境變數屬性} | ${env.JAVE_HOME} |
具體如何檢視這些屬性:
在cmd命令列中輸入mvn help:system
具體使用,就是使用 ${key}
來獲取,key為等號左邊的,值為等號右邊的,比如獲取紅線的值,對應的寫法為 ${java.runtime.name}
。
3. 版本管理
關於這個版本管理解決的問題是,在Maven建立專案和引用別人專案的時候,我們都看到過如下內容:
這裡面有兩個單詞,SNAPSHOT和RELEASE,它們所代表的含義是什麼呢?
我們開啟Maven倉庫地址https://mvnrepository.com/
在我們jar包的版本定義中,有兩個工程版本用的比較多:
- SNAPSHOT(快照版本)
- 專案開發過程中臨時輸出的版本,稱為快照版本
- 快照版本會隨著開發的進展不斷更新
- RELEASE(釋出版本)
- 專案開發到一定階段里程碑後,向團隊外部發布較為穩定的版本,這種版本所對應的構件檔案是穩定的
- 即便進行功能的後續開發,也不會改變當前釋出版本內容,這種版本稱為釋出版本
除了上面的工程版本,我們還經常能看到一些釋出版本:
- alpha版:內測版,bug多不穩定內部版本不斷新增新功能
- beta版:公測版,不穩定(比alpha穩定些),bug相對較多不斷新增新功能
- 純數字版