最近有小夥伴問到C哥一個關於 Maven 依賴的問題,涉及到 classifier 屬性,隨機問了幾個小夥伴,都說工作中沒用到過,因此簡單整篇文章和小夥伴們分享下。
Maven 大家日常開發應該都有使用,Maven 中有一個比較好玩的 classifier 屬性不知道小夥伴們有沒有用過?
簡單聊一聊這個話題。
一 Classifier 屬性的作用
Classifier 屬性在 Maven 中的主要作用是用於區分同一 artifact 的不同版本或變種。在 Maven 的座標系統中,一個 artifact 通常由 groupId、artifactId 和 version 三個基本元素確定。
然而,在某些情況下,我們可能需要為同一個 artifact 建立多個不同的版本或變種,比如原始碼包、文件包或特定平臺的二進制包等。這時,Classifier屬性就派上了用場。
透過為 artifact 新增 Classifier 屬性,我們可以為同一個 artifact 建立多個不同的附件(attachment)。這些附件可以是原始碼、測試程式碼、文件、特定平臺的二進制檔案等。每個附件都有一個唯一的 Classifier 值,用於區分它們。這樣,我們就可以在 Maven 倉庫中儲存和管理這些不同的 artifact 變種,並在構建過程中根據需要引用它們。
例如下面這張圖:
如果我想引用第一個 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,從而輕鬆地將其整合到其他專案中。