在父类dependencyManagement中定义依赖项版本时,未解析传递依赖项

时间:2013-02-08 19:51:44

标签: java maven maven-3

我有一个多模块项目,其布局如下:

pom.xml
projA
  trunk
    pom.xml
    projA1
      pom.xml
    projA2
      pom.xml

在父母的pom中,我定义了dependencyManagementproperties

<properties>
  <javaee-api.version>6.0</javaee-api.version>
  <log4j.version>1.2.11</log4j.version>
</properties>
...
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>  
      <artifactId>junit</artifactId>
      <version>${junit.version}</version>
    </dependency>
    <dependency>
      <groupId>javax</groupId>  
      <artifactId>javaee-api</artifactId>
      <version>${javaee-api.version}</version>
    </dependency>
  </dependencies>
</dependencyManagement>

projA2的pom.xml包含:

<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
</dependency>

projA1的pom.xml包含:

<dependency>
  <groupId>${project.groupId}</groupId>
  <artifactId>projA2</artifactId>
  <version>${project.version}</version>
</dependency>

在projA1中我使用log4j,但依赖是传递的(来自projA2)。

现在,当我运行mvn dependency:tree -X时,我得到了:

[WARNING] Invalid POM for mypackage:projA2:jar:1.0, transitive dependencies (if any) will not be available, enable debug logging for more details: Some problems were encountered while processing the POMs:
[ERROR] 'dependencies.dependency.version' for javax:javaee-api:jar is missing. @ line 37, column 15
[ERROR] 'dependencies.dependency.version' for log4j:log4j:jar is missing. @ line 56, column 15

但是在这条线下面我得到了:

[DEBUG]   testArtifact: artifact=log4j:log4j:jar:1.2.11:compile
[DEBUG]   includeArtifact: artifact=log4j:log4j:jar:1.2.11:compile
[DEBUG]   startProcessChildren: artifact=log4j:log4j:jar:1.2.11:compile
[DEBUG]   endProcessChildren: artifact=log4j:log4j:jar:1.2.11:compile
[DEBUG]   testArtifact: artifact=javax:javaee-api:jar:6.0:provided
[DEBUG]   includeArtifact: artifact=javax:javaee-api:jar:6.0:provided
[DEBUG]   startProcessChildren: artifact=javax:javaee-api:jar:6.0:provided
[DEBUG]   endProcessChildren: artifact=javax:javaee-api:jar:6.0:provided

唯一的解决方案是在projA2 pom.xml中指定log4j版本(<version>${project.version}</version>)。

问题:我做错了什么:-(?我不想指定已在父dependencyManagement部分中定义的版本。

7 个答案:

答案 0 :(得分:8)

我遇到了同样的问题。在我的情况下,如果忘记更新本地存储库中的父POM。尝试做

mvn install

用于父模块。

答案 1 :(得分:3)

有类似的问题。删除(手动)本地存储库中涉及的所有项目并运行“mvn clean install”后来为我工作。

答案 2 :(得分:0)

<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
</dependency>

需要在/projA/trunk/pom.xml而不是/projA/trunk/projA2/pom.xml

当然,如果您希望在所有项目中都可以使用它,而不仅仅是projA,那么它必须位于pom.xml

答案 3 :(得分:0)

我遇到了类似的问题:我在settings.xml中定义了一个属性,并将其用于我的poms和父pom中的依赖关系中的systemPaths。忽略&#34;无效&#34; package导致编译错误,因为在类路径中缺少用作传递依赖的包。

我发现(转移到你的问题),如果我用&#34; mvn -Dlog4j.version = 2.1.11&#34;警告消失,编译错误也消失。对我来说,这不是令人满意的解决方案,但它解决了隐形传递依赖的问题。

答案 4 :(得分:0)

我遇到与OP完全相同的问题。事实证明这是一个maven bug,因为更新到最新的maven版本(写作时为3.3.3)解决了这个问题。

答案 5 :(得分:0)

它可能是存储库问题搜索您缺少的依赖项找到正确的存储库并添加到您这样的pom:

<repositories>
        <repository>
            <id>jboss-3rd-party-releases</id>
            <url>https://repository.jboss.org/nexus/content/repositories/thirdparty-releases/</url>
        </repository>
    </repositories>

答案 6 :(得分:-1)

添加:

<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>${log4j.version}</version>
</dependency>

到父POM的dependencyManagement部分(就像使用JUnit一样)。任何需要log4j的子代都可以指定依赖项:

<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
</dependency>

没有版本,它会起作用,因为版本将从父版本中提取。