AdSense

網頁

2018/8/26

Java Maven 什麼是Artifact?

Maven的artifact是指一個專案(project)建構(build)後產生的東西,中文可翻為"製品"或"構造物"或"構件"。


引述官網的Artifact說明

Artifact: An artifact is something that is either produced or used by a project. Examples of artifacts produced by Maven for a project include: JARs, source and binary distributions, WARs. Each artifact is uniquely identified by a group id and an artifact ID which is unique within a group.


最常見的artifact就是jar檔,此外也可能是war檔,pom檔等。這些Maven建構專案所生成的檔案在Maven的術語通稱為artifact。

每一個artifact都以groupId、artifactId與version來做為唯一識別,這三者的組合又稱為Maven Coordinates(Maven座標),用以區別其他的artifact。

groupId通常是以domain來命名,例如com.example。而artifactId通常是專案名稱。而每個artifact的不同版本就用versoin來區分。

你可能會覺得groupId和Java的package用途很類似,兩者有什麼分別? 其實你想得沒錯,artifact的groupId和class的package的作用都是用來區分相同名稱的東西,不過一個是區分artifact,一個是區分class。

例如我所在的公司domain為abc.com,則groupId可命名為com.abc,開發的專案名稱為banana,則artifactId命名為banana,版本為0.0.1-SNAPSHOT,則在Maven專案的pom.xml如下。

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.abc</groupId>
    <artifactId>banana</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</project>

以實際的例子來看,下面是Spring Core 5.0.8.RELEASE的artifact的Maven Dependency,而其實就是指Spring Core 5.0.8.RELEASE的jar檔。下面的意思就依賴org.springframework.spring-core這個artifact,版本為5.0.8.RELEASE。

<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.0.8.RELEASE</version>
</dependency>

換個方式來解釋,今天我在Eclipse建立一個banana的Maven專案,並打算將banana專案打包成一個jar檔給其他專案來使用,則這個jar檔就是banana專案生成的artifact。

所以我們在Eclipse建立一個新的Maven專案時,都會要我們命名groupId,artifactId。若日後其他的Maven專案要利用到這個專案中的程式,則我們可以用Maven建構此專案的artifact(打包成jar)並發佈在Maven repository(至於怎麼發佈到repository在此先不討論),接著在另一個專案的pom.xml的dependency中撰寫以下來匯入jar檔。

<dependency>
    <groupId>com.abc</groupId>
    <artifactId>banana</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

下面用Eclipse來說明可能會比較清楚。

首先在Eclipse(OXYGEN)中建立一個簡單的Maven Project。

點選上方功能選單的File -> New -> Maven Project

勾選[Create a simple project (skp archetype selection)]然後按Next >



輸入[Group Id]及[Artifact Id]的名稱,[Version]使用預設的0.0.1-SNAPSHOT,[Packaging]選擇jar。然後按Finish



完成後可在Eclipse左側的Project Explore看到新建的banana Maven專案,自動產生的pom.xml內容如下

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.abc</groupId>
    <artifactId>banana</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</project>

接著執行Maven build將此專案打包成jar檔,這個動作就是生成所謂的artifact。

在banana專案名稱上按滑鼠右鍵,選擇Run As -> 3 Maven build...



在[Goals]欄位輸入package,其餘保持預設,然後按Run來執行。(package指令用來編譯並打包)



接著可以在Eclipse的Console看到印出如下的訊息。

[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building banana 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ banana ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ banana ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ banana ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ banana ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ banana ---
[INFO] 
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ banana ---
[INFO] Building jar: D:\MyProject\jdk8\workspace\banana\target\banana-0.0.1-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.515 s
[INFO] Finished at: 2018-08-26T20:53:41+08:00
[INFO] Final Memory: 10M/155M
[INFO] ------------------------------------------------------------------------

執行完後重新整理banana專案,可以在專案目錄下的target資料夾看到Maven build生成的artifact,也就是jar檔。




沒有留言:

AdSense