2017-01-23 482 views
2

我創建了這個示例POM文件,以便我不需要在每個子項目中複製的依賴項版本。我的要求是不必爲每個項目提供第三方版本。每個項目應該從bom文件繼承庫版本。我創建了基於documentation of Maven dependencies的示例。我的Maven版本是的Apache Maven的3.2.5爲什麼maven子從BOM中引用版本不起作用?

我得到以下

[INFO] Scanning for projects... 
[ERROR] The build could not read 1 project -> [Help 1] 
[ERROR] 
[ERROR] The project org.test.testapp:test-app:1.0-SNAPSHOT (/Users/skoya/workspace/test-app/pom.xml) has 2 errors 
[ERROR]  'dependencies.dependency.version' for junit:junit:jar is missing. @ line 22, column 17 
[ERROR]  'dependencies.dependency.version' for commons-cli:commons-cli:jar is missing. @ line 26, column 17 

根BOM POM文件

<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>org.test</groupId> 
     <artifactId>bom</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
     <packaging>pom</packaging> 
     <name>test-dependencies-bom</name> 
     <url>http://myorg.org</url> 

     <properties> 
       <commons-cli.version>1.3</commons-cli.version> 
       <junit.version>3.8.1</junit.version> 
     </properties> 

     <modules> 
      <module>test-dependencies</module> 
     </modules> 
</project> 

測試依賴性/ 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>org.test</groupId> 
     <artifactId>test-parent-pom</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
     <packaging>pom</packaging> 

     <name>test-parent-pom</name> 
     <url>http://maven.apache.org</url> 
     <parent> 
       <groupId>org.test</groupId> 
       <artifactId>bom</artifactId> 
       <version>0.0.1-SNAPSHOT</version> 
     </parent> 

     <prerequisites> 
       <maven>3.0.0</maven> 
     </prerequisites> 


     <dependencies> 
       <dependency> 
         <groupId>commons-cli</groupId> 
         <artifactId>commons-cli</artifactId> 
         <version>${commons-cli.version}</version> 
       </dependency> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
         <version>${junit.version}</version> 
    </dependency> 

     </dependencies> 
</project> 

Maven項目文件引用BOM文件

<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/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>org.test.testapp</groupId> 
    <artifactId>test-app</artifactId> 
    <packaging>jar</packaging> 
    <version>1.0-SNAPSHOT</version> 
    <name>test-app</name> 
    <url>http://maven.apache.org</url> 
    <dependencyManagement> 
    <dependencies> 
     <dependency> 
     <groupId>org.test</groupId> 
     <artifactId>bom</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
     <type>pom</type> 
     <scope>import</scope> 
     </dependency> 
    </dependencies> 
    </dependencyManagement> 
    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>commons-cli</groupId> 
     <artifactId>commons-cli</artifactId> 
    </dependency> 
    </dependencies> 
</project> 

回答

1

有2個問題:

  1. 對於進口的依賴,進口POM項目(測試依賴性/ pom.xml的)應該定義依賴關係導入<dependencyManagement>部分,而不僅僅是<dependencies>,與原始示例中的相同。
  2. 導入該pom的項目需要導入聲明依賴關係的項目(test-dependencies/pom.xml),而不是父pom.xml。

我通過進行以下更改來解決此問題。

測試依賴性/ 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>org.test</groupId> 
    <artifactId>test-parent-pom</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>pom</packaging> 
    <name>test-parent-pom</name> 
    <url>http://maven.apache.org</url> 

    <parent> 
    <groupId>org.test</groupId> 
    <artifactId>bom</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    </parent> 

    <prerequisites> 
    <maven>3.0.0</maven> 
    </prerequisites> 

    <dependencyManagement> 
    <dependencies> 
     <dependency> 
     <groupId>commons-cli</groupId> 
     <artifactId>commons-cli</artifactId> 
     <version>${commons-cli.version}</version> 
     </dependency> 
     <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>${junit.version}</version> 
     </dependency> 
    </dependencies> 
    </dependencyManagement> 
</project> 

Maven項目文件引用BOM文件

<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/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>org.test.testapp</groupId> 
    <artifactId>test-app</artifactId> 
    <packaging>jar</packaging> 
    <version>1.0-SNAPSHOT</version> 
    <name>test-app</name> 
    <url>http://maven.apache.org</url> 
    <dependencyManagement> 
    <dependencies> 
     <dependency> 
     <groupId>org.test</groupId> 
     <artifactId>test-parent-pom</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
     <type>pom</type> 
     <scope>import</scope> 
     </dependency> 
    </dependencies> 
    </dependencyManagement> 
    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>commons-cli</groupId> 
     <artifactId>commons-cli</artifactId> 
    </dependency> 
    </dependencies> 
</project> 

在那之後,我是能夠建立和驗證項目進口該pom帶來了預期的依賴關係:

mvn dependency:tree 
... 
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ test-app --- 
[INFO] org.test.testapp:test-app:jar:1.0-SNAPSHOT 
[INFO] +- junit:junit:jar:3.8.1:compile 
[INFO] \- commons-cli:commons-cli:jar:1.3:compile 

請注意,它仍然成功從父pom.xml中拉取了屬性中定義的版本號。這是構建項目的完美方法。它只需要我描述的2個調整。

+0

謝謝。現在它可以工作。沒有正確讀取父pom.xml中的依賴管理部分。 – randominstanceOfLivingThing

相關問題