1 .使用項目繼承sql
利用項目繼承能夠將結構信息,部署信息,共同的依賴信息放置在單一的位置。在每一個工程的 pom 中:apache
- <parent>
- <groupId>org.apache.maven.proficio</groupId>
- <artifactId>proficio</artifactId>
- <version>1.0-SNAPSHOT</version>
- </parent>
這使得項目的 pom 能夠繼承頂層 pom 中的定義,檢查頂層 pom 的 dependencies 部分:api
- <project>
- <dependencies >
- <dependency >
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.7</version>
- <scope>test</scope>
- </dependency >
- </dependencies >
- </project>
在各個子模塊的 pom 中沒有對 Junit 依賴的定義,可是從頂層 pom 中繼承了依賴的定義。maven
爲了看清楚能夠在一個子模塊 pom 所在目錄下,執行命令ide
- #mvn help:effective-pom
能夠看到最終起效果的 pom ,這在找錯時頗有效。測試
2 .管理依賴spa
在 pom 中指明 dependency management 元素的方式 maven 結合項目繼承來管理依賴。在多模塊應用中,可能多個子項目會有共同的依賴。此時爲了正確運行,必須讓全部的子項目使用依賴項的同一版本。必須確保應用的各個項目的依賴項和版本一致,才能保證測試的和發佈的是相同的成果。所以,應在頂層的 pom 中定義共同的依賴關係。code
在 Proficio 應用的頂層 pom 中的 dependency management 段以下:xml
- <dependencyManagement>
- <dependencies >
- <dependency >
- <groupId>com.devzuz.mvnbook.proficio</groupId>
- <artifactId>proficio-model</artifactId>
- <c>${project.version}</version>
- </dependency >
- <dependency >
- <groupId>com.devzuz.mvnbook.proficio</groupId>
- <artifactId>proficio-api</artifactId>
- <version>${project.version}</version>
- </dependency >
- <dependency >
- <groupId>com.devzuz.mvnbook.proficio</groupId>
- <artifactId>proficio-core</artifactId>
- <version>${project.version}</version>
- </dependency >
- <dependency >
- <groupId>com.devzuz.mvnbook.proficio</groupId>
- <artifactId>proficio-store-memory</artifactId>
- <version>${project.version}</version>
- </dependency >
- <dependency >
- <groupId>com.devzuz.mvnbook.proficio</groupId>
- <artifactId>proficio-store-xstream</artifactId>
- <version>${project.version}</version>
- </dependency >
- <dependency >
- <groupId>org.codehaus.plexus</groupId>
- <artifactId>plexus-container-default</artifactId>
- <version>1.0-alpha-9</version>
- </dependency >
- </dependencies >
- </dependencyManagement>
注意 ${project.version} 變量指的是應用的 version 。繼承
頂層 pom 中的 dependencies 與 dependencyManagement 中的 dependencies 元素有一個重要的區別:
dependencyManagement 中的 dependencies 元素只代表依賴項版本的優先選擇,並不影響項目的依賴項;而 dependencies 元素則影響項目的依賴項。
檢查 Proficio api 模塊的 pom:
- <project>
- <parent>
- <groupId>com.devzuz.mvnbook.proficio</groupId>
- <artifactId>proficio</artifactId>
- <version>1.0-SNAPSHOT</version>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <artifactId>proficio-api</artifactId>
- <packaging>jar</packaging>
- <name>Proficio API</name>
- <dependencies >
- <dependency >
- <groupId>com.devzuz.mvnbook.proficio</groupId>
- <artifactId>proficio-model</artifactId>
- </dependency >
- </dependencies >
- </project>
其中沒有指明依賴項的版本信息,在頂層 pom 中的 dependencyManagement 中代表其優選的版本是 ${project.version} 即 1.0-SNAPSHOT 。爲使其模塊 pom 完整,其版本信息會注入其中。
只有當 外層的dependencies 元素中沒有指明版本信息時, dependencyManagement 中的 dependencies 元素才起做用。
注意:一個是項目依賴,一個是多模塊maven項目時候的依賴管理控制的。