2017-01-23 40 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

相关问题