聊聊maven指定version區間的妙用

發表於2024-02-27

前言

在我們開發微服務專案的過程中,難免會依賴各種jar,開發環境可能引用1.0.0-SNAPSHOT,而到了正式環境,則需要引用1.0.0。之前我們的做法是透過pom配置profile來達到不同環境,使用不同的版本。形如下

<profiles>
        <!-- 開發環境 -->
        <profile>
            <properties>
                <user-api.version>1.0.0-SNAPSHOT</user-api.version>
            </properties>
            <activation>
            <!-- 指定預設環境 -->
           <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <!-- 生產環境 -->
        <profile>
            <id>prod</id>
            <properties>
               <properties>
                <user-api.version>1.0.0</user-api.version>
            </properties>
        </profile>
    </profiles>

直到某一天,忘了在哪個開源的pom,看到了形如下寫法

  <dependency>
            <groupId>com.github.lybgeek</groupId>
            <artifactId>lybgeek</artifactId>
            <version>[1.0,2.0]</version>
        </dependency>

一開始還以為是啥jar那麼特立獨行,版本號竟然是[1.0,2.0],後面瞭解了一下,才知道的自己的無知,同時也開啟新世界大門

正文

[1.0,2.0]這個到底是啥?

這個代表其實就是一個version區間,表示的意思是,該區間的版本都是可用版本,預設取最新的版本,即2.0。其他的區間配法示例

(,1.0]          x <= 1.0
[1.0]           x = 1.0 跟直接指定1.0沒有區別
[1.2,1.3]       1.2 <= x <= 1.3
[1.0,2.0)       1.0 <= x < 2.0
[1.5,)          x >= 1.5
(,1.0],[1.2,)   x <= 1.0 or x >= 1.2
(,1.1),(1.1,)   x < 1.1 or x > 1.1 即排除1.1的版本

注: x為具體使用的版本號。預設情況下,同版本的快照版本會小於非快照版本

[1.0-SNAPSHOT,1.0]  如果1.0不存在則使用1.0-SNAPSHOT,1.0存在則使用1.0版本
[1.0,1.0-SNAPSHOT]  錯誤,會提示:Reason: Range defies version ordering

有了這個認知後,我們在依賴其他jar時,就可以指定形如下

<dependency>
            <groupId>com.github.lybgeek</groupId>
            <artifactId>user-api</artifactId>
            <version>[1.0.0-SNAPSHOT,1.0.0]</version>
        </dependency>

比如開發環境沒有1.0.0版本,則會引用1.0.0-SNAPSHOT,而正式環境有1.0.0則會引1.0.0

總結

maven version區間確實能減少我們一些配置的工作量,但是凡事都有兩面性,如果版本之間存在不相容情況下,最好還是具體指定版本

相關文章