2017年3月22日 星期三

聚合、依賴、繼承、插件 (Maven 4)

※聚合


上面的 A、B 專案,都要先 install 才能讓 C 抓到,這如果不只這兩個專案,那每一個都要先 install,太沒效率了,所以可用繼承的方式,統一用一個 pom.xml 就好了,操作如下:

1.新增 maven 專案後,勾下面的選項



 2.package 要選 pom



※D的pom


<project ...>
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>maven_test</groupId>
    <artifactId>D</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    
    <modules>
        <module>../A</module>
        <module>../B</module>
        <module>../C</module>
    </modules>
</project>

※因為 4 個專案同一層,所以要到上一層才可以抓到其他專案

※packaging 裡的 pom 一定要小寫

※此時只要操作 D 專案即可一次統一操作 3 個專案

※但有些人不想要新增一個專案,也可以將 D 的 pom.xml 複製到 ABC 三個專案的同層,而 D 專案也刪了,最後用命令提示字元下 mvn clean install,當然 Eclipse 還是能 import



※依賴


※左圖

C 專案依賴 A 和 B 專案,只要 scope 是 compile(預設) ,就會將 A、B 兩個專案的 jar 檔,複製到 C 專案
如果有同樣的 jar 檔,會以依賴最短的優先,但路徑都是 1,所以就會以 pom 檔的順序為主,誰先寫誰就贏了

※右圖

C 專案依賴 B 和 A1 專案,只要 scope 是 compile(預設) ,就會將 B、A1 兩個專案的 jar 檔,複製到 C 專案,但 A1 又依賴 A 專案,所以 A 也會複製給 C 專案
如果有同樣的 jar 檔,會以依賴最短的優先,所以會以 B 為主

如果不想依賴 maven 規定好的 jar,那就可以在不想依賴的 <dependency>增加<exclusions>來排除
<dependency>
    <groupId>maven_test</groupId>
    <artifactId>C</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <exclusions>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>


※注意 C 專案要抓到 A、B 專案,必需先 mvn install ,這樣 .m2 才會有 jar 檔供 C 下載



※繼承

※父類

<groupId>bruce.chen</groupId>
<artifactId>D</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
    
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
    
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.2.2.RELEASE</version>
        </dependency>
    </dependencies>
</dependencyManagement>

※packaging 一定是 pom,否則子類會報錯

※使用 dependencyManagement 標籤將 dependencies 裝起來

※子類

<artifactId>B</artifactId>
<packaging>jar</packaging>
    
<parent>
    <groupId>bruce.chen</groupId>
    <artifactId>D</artifactId>
    <version>1.0-SNAPSHOT</version>
</parent>
    
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>


※寫個 parent 標籤,表示它還有父 pom

※自己坐標的 groupId 和 version 如果和父類一樣,也可以刪除

※dependency 標籤的 version 也可以刪除

※parent 有個子標籤 relativePath,預設是 ../pom.xml,如果不是就要打出來了


※插件

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.0.1</version>
<executions>
<execution>
<phase>generate-test-resources</phase>
<goals>
<goal>jar</goal>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

phase 要打上生命週期的名字,也就是哪時候執行這個插件
goal 可以多個,此例是打原碼包和打測試包,至於裡面要打什麼,可參考下圖


左邊選擇 Maven Plugins 會自動跳動上圖的 Plugins,然後選擇 source,表示要打源碼包,點進去就會看到可以用的 goals

此例在 compile phase 並不會打上面設定的 jar 包,可參考下圖



可以看出 compile 還沒到我們指定的 phase,但 package 有包括,加上原本的 jar,總共有三個
demo-0.0.1-SNAPSHOT.jar:原本的 jar 包
demo-0.0.1-SNAPSHOT-sources.jar:goal 為 jar 生出來的,內容和原本的一模一樣,不會有測試的類別
demo-0.0.1-SNAPSHOT-test-sources.jar:goal 為 test-jar 生出來的, 內容只有測試類別
.可以用解壓工具看裡面的內容
.如果專案是 springboot,還會有第四包,springboot 是可以執行的 jar 包,但要打上如下的標籤
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
通常 IDE 內鍵都會幫忙生成

沒有留言:

張貼留言