1. 程式人生 > 其它 >Maven專案屬性與版本管理

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相對較多不斷新增新功能
  • 純數字版

專案程式碼