1. 程式人生 > >maven之聚合和繼承

maven之聚合和繼承

maven聚合工程時為了方便管理,可能一個工程有多個子模組,這時可以建立聚合工程管理.

maven繼承是為了方便jar包管理,比如:可能A B C三個工程都需要junit jar包,在每個工程新增jar包依賴會顯得重複,這時只需要建立一個工程讓A B C繼承,在父工程中新增公共依賴就可以了.

用Eclipse建立聚合工程:

先建立聚合父工程:



注意打包方式選擇pom

再建立聚合子工程


============================


聚合子工程a的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>
  <parent>
    <groupId>com.test</groupId>
    <artifactId>parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>a</artifactId>
</project>
預設子聚合工程是繼承父工程的.

如不想繼承只想聚合,刪除parent標籤,修改artifactId

<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.test</groupId>
    <artifactId>c</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    
</project>

繼承工程只需要在父工程中新增jar包,子工程就會自動新增.

==============================

maven jar包版本管理

 <properties>
  	<hinernate.version>5.0.7.Final</hinernate.version>
  	<spring.version>4.2.4.RELEASE</spring.version>
  	<struts.version>2.3.24</struts.version>
  </properties>
<dependency>
  		<groupId>org.hibernate</groupId>
  		<artifactId>hibernate-core</artifactId>
  		<version>${hinernate.version}</version>
  	</dependency>
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-core</artifactId>
  		<version>${spring.version}</version>
  	</dependency>

==================================

dependencyManagement

Maven 使用dependencyManagement 元素來提供了一種管理依賴版本號的方式。通常會在一個組織或者專案的最頂層的父POM 中看到dependencyManagement 元素。使用pom.xml 中的dependencyManagement 元素能讓
所有在子專案中引用一個依賴而不用顯式的列出版本號。Maven 會沿著父子層次向上走,直到找到一個擁有dependencyManagement 元素的專案,然後它就會使用在這個dependencyManagement 元素中指定的版本號。

例如在父專案裡:

Xml程式碼  收藏程式碼
  1. <dependencyManagement>  
  2. <dependencies>  
  3. <dependency>  
  4. <groupId>mysql</groupId>  
  5. <artifactId>mysql-connector-java</artifactId>  
  6. <version>5.1.2</version>  
  7. </dependency>  
  8. ...  
  9. <dependencies>  
  10. </dependencyManagement>  

然後在子專案裡就可以新增mysql-connector時可以不指定版本號,例如:

Xml程式碼  收藏程式碼
  1. <dependencies>  
  2. <dependency>  
  3. <groupId>mysql</groupId>  
  4. <artifactId>mysql-connector-java</artifactId>  
  5. </dependency>  
  6. </dependencies>  

這樣做的好處就是:如果有多個子專案都引用同一樣依賴,則可以避免在每個使用的子專案裡都宣告一個版本號,這樣當想升級或切換到另一個版本時,只需要在頂層父容器裡更新,而不需要一個一個子專案的修改 ;另外如果某個子專案需要另外的一個版本,只需要宣告version就可。

在Maven中dependencyManagement的作用其實相當於一個對所依賴jar包進行版本管理的管理器。

       pom.xml檔案中,jar的版本判斷的兩種途徑

1.如果dependencies裡的dependency自己沒有宣告version元素,那麼maven就會倒dependencyManagement裡面去找有沒有對該artifactId和groupId進行過版本宣告,如果有,就繼承它,如果沒有就會報錯,告訴你必須為dependency宣告一個version。

2.如果dependencies中的dependency聲明瞭version,那麼無論dependencyManagement中有無對該jar的version宣告,都以dependency裡的version為準。


========================

jar包排除

jar包版本衝突,如果這兩個jar包同時存在,會導致後續某些操作會存在問題(比如openSessionInView失效),所以需要排除低版本的jar包。

如何來排除依賴呢?新增下面紅色字型的部分。作用是排除struts中依賴的javassist的jar

<dependency>

<groupId>org.apache.struts</groupId>

<artifactId>struts2-core</artifactId>

<version>2.3.24</version>

      <exclusions>

           <exclusion>

              <groupId>javassist</groupId>

              <artifactId>javassist</artifactId>

           </exclusion>

       </exclusions>

</dependency>