切換語言為:簡體
聊聊 classifier 屬性在 Maven 中的作用

聊聊 classifier 屬性在 Maven 中的作用

  • 爱糖宝
  • 2024-05-31
  • 2226
  • 0
  • 0

最近有小夥伴問到C哥一個關於 Maven 依賴的問題,涉及到 classifier 屬性,隨機問了幾個小夥伴,都說工作中沒用到過,因此簡單整篇文章和小夥伴們分享下。

Maven 大家日常開發應該都有使用,Maven 中有一個比較好玩的 classifier 屬性不知道小夥伴們有沒有用過?

簡單聊一聊這個話題。

一 Classifier 屬性的作用

Classifier 屬性在 Maven 中的主要作用是用於區分同一 artifact 的不同版本或變種。在 Maven 的座標系統中,一個 artifact 通常由 groupId、artifactId 和 version 三個基本元素確定。

然而,在某些情況下,我們可能需要為同一個 artifact 建立多個不同的版本或變種,比如原始碼包、文件包或特定平臺的二進制包等。這時,Classifier屬性就派上了用場。

透過為 artifact 新增 Classifier 屬性,我們可以為同一個 artifact 建立多個不同的附件(attachment)。這些附件可以是原始碼、測試程式碼、文件、特定平臺的二進制檔案等。每個附件都有一個唯一的 Classifier 值,用於區分它們。這樣,我們就可以在 Maven 倉庫中儲存和管理這些不同的 artifact 變種,並在構建過程中根據需要引用它們。

例如下面這張圖:

聊聊 classifier 屬性在 Maven 中的作用

如果我想引用第一個 shiro-web-2.0.0-jakarta.jar 該怎麼寫呢?下面這種寫法顯然不對,這種寫法引入的是 shiro-web-2.0.0.jar。

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-web</artifactId>
    <version>2.0.0</version>
</dependency>

二 在依賴中引用Classifier

當我們需要在其他 Maven 專案中引用具有 Classifier 的 artifact 時,我們需要在依賴宣告中指定 classifier 屬性。例如:

<dependencies>  
    <dependency>  
        <groupId>com.example</groupId>  
        <artifactId>my-artifact</artifactId>  
        <version>1.0.0</version>  
        <classifier>sources</classifier>  
        <type>jar</type>  
        <scope>compile</scope>  
    </dependency>  
</dependencies>

在上面的示例中,我們引用了一個 Classifier 值為 sources 的 artifact 變種。Maven 將根據 groupId、artifactId、version 和 classifier 的值在倉庫中查詢相應的 artifact,並將其新增到專案的依賴中。

如果是上面的 Shiro 依賴呢?寫法如下:

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-web</artifactId>
    <version>2.0.0</version>
    <classifier>jakarta</classifier>
</dependency>

三 自定義 Classifier 屬性

上面是我們引用別人的專案,配置 Classifier,如果要在自己的 Maven 專案中定義 Classifier,那麼我們需要在 pom.xml 檔案中進行相應的配置。具體來說,我們需要在 build 標籤下新增 maven-jar-plugin 外掛,併爲其配置 classifier 屬性。例如,如果我們想要建立一個包含原始碼的 artifact 變種,可以這樣做:

<build>  
    <plugins>  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-jar-plugin</artifactId>  
            <version>3.2.0</version>  
            <executions>  
                <execution>  
                    <goals>  
                        <goal>jar</goal>  
                    </goals>  
                </execution>  
                <execution>  
                    <id>attach-sources</id>  
                    <goals>  
                        <goal>jar</goal>  
                    </goals>  
                    <configuration>  
                        <classifier>sources</classifier>  
                    </configuration>  
                </execution>  
            </executions>  
        </plugin>  
    </plugins>  
</build>

在上面的示例中,我們為 maven-jar-plugin 外掛新增了一個名為 attach-sources 的執行,併爲其配置了 classifier 屬性為 sources。這表示我們將建立一個包含原始碼的 artifact 變種,其 Classifier 值為 sources。

四 總結

Maven 的 Classifier 屬性為我們在構建和管理 Java 專案時提供了極大的靈活性。透過為 artifact 新增 Classifier 屬性,我們可以建立多個不同的版本或變種,以滿足不同的專案需求或構建環境。同時,我們還可以在依賴宣告中引用具有 Classifier 的 artifact,從而輕鬆地將其整合到其他專案中。

0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.