※聚合
上面的 A、B 專案,都要先 install 才能讓 C 抓到,這如果不只這兩個專案,那每一個都要先 install,太沒效率了,所以可用繼承的方式,統一用一個 pom.xml 就好了,操作如下:
1.新增 maven 專案後,勾下面的選項
※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 內鍵都會幫忙生成