Maven屬性與版本管理詳細步驟分解

屬性

問題引入

前面我們已經在父工程中的dependencyManagement標簽中對項目中所使用的jar包版本進行瞭統一的管理,但是如果在標簽中有如下的內容:

你會發現,如果我們現在想更新Spring的版本,你會發現我們依然需要更新多個jar包的版本,這樣的話還是有可能出現漏改導致程序出問題,而且改起來也是比較麻煩。

問題清楚後,我們需要解決的話,就可以參考咱們java基礎所學習的變量,聲明一個變量,在其他地方使用該變量,當變量的值發生變化後,所有使用變量的地方,就會跟著修改,即:

解決步驟

步驟1:父工程中定義屬性

<properties>
    <spring.version>5.2.10.RELEASE</spring.version>
    <junit.version>4.12</junit.version>
    <mybatis-spring.version>1.3.0</mybatis-spring.version>
</properties>

步驟2:修改依賴的version

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring.version}</version>
</dependency>
<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>

此時,我們隻需要更新父工程中properties標簽中所維護的jar包版本,所有子項目中的版本也就跟著更新。當然除瞭將spring相關版本進行維護,我們可以將其他的jar包版本也進行抽取,這樣就可以對項目中所有jar包的版本進行統一維護,如:

<!--定義屬性-->
<properties>
    <spring.version>5.2.10.RELEASE</spring.version>
    <junit.version>4.12</junit.version>
    <mybatis-spring.version>1.3.0</mybatis-spring.version>
</properties>

配置文件加載屬性

Maven中的屬性我們已經介紹過瞭,現在也已經能夠通過Maven來集中管理Maven中依賴jar包的版本。但是又有新的需求,就是想讓Maven對於屬性的管理范圍能更大些,比如我們之前項目中的jdbc.properties,這個配置文件中的屬性,能不能也來讓Maven進行管理呢?

答案是肯定的,具體的實現步驟為:

步驟1:父工程定義屬性

<properties>
   <jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_db</jdbc.url>
</properties>

步驟2:jdbc.properties文件中引用屬性

在jdbc.properties,將jdbc.url的值直接獲取Maven配置的屬性

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=${jdbc.url}
jdbc.username=root
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_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系統屬性
  • 環境變量屬性

具體如何查看這些屬性:

在cmd命令行中輸入mvn help:system

具體使用,就是使用 ${key}來獲取,key為等號左邊的,值為等號右邊的,比如獲取紅線的值,對應的寫法為 ${java.runtime.name}

版本管理

關於這個版本管理解決的問題是,在Maven創建項目和引用別人項目的時候,我們都看到過如下內容:

這裡面有兩個單詞,SNAPSHOT和RELEASE,它們所代表的含義是什麼呢?

我們打開Maven倉庫地址https://mvnrepository.com/

在我們jar包的版本定義中,有兩個工程版本用的比較多:

SNAPSHOT(快照版本)

  • 項目開發過程中臨時輸出的版本,稱為快照版本快照版本
  • 會隨著開發的進展不斷更新

RELEASE(發佈版本)

  • 項目開發到一定階段裡程碑後,向團隊外部發佈較為穩定的版本,這種版本所對應的構件文件是穩定的
  • 即便進行功能的後續開發,也不會改變當前發佈版本內容,這種版本稱為發佈版本

除瞭上面的工程版本,我們還經常能看到一些發佈版本:

  • alpha版:內測版,bug多不穩定內部版本不斷添加新功能
  • beta版:公測版,不穩定(比alpha穩定些),bug相對較多不斷添加新功能
  • 純數字版

對於這些版本,大傢隻需要簡單認識下即可。

到此這篇關於Maven屬性與版本管理詳細步驟分解的文章就介紹到這瞭,更多相關Maven屬性與版本內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: