【问题标题】:Transitive dependencies not resolved when dependency version defined in parents dependencyManagement在父依赖项管理中定义依赖项版本时未解决传递依赖项
【发布时间】:2013-01-24 16:10:05
【问题描述】:

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

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 版本 (&lt;version&gt;${project.version}&lt;/version&gt;)。

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

【问题讨论】:

    标签: java maven maven-3


    【解决方案1】:

    我也遇到过同样的问题。在我的情况下,如果忘记更新本地存储库中的父 POM。努力去做

    mvn install
    

    用于父模块。

    【讨论】:

    • 如果你想构建一个没有所有子模块的父模块,请使用“mvn install -N”
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
      </dependency>
      

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

      当然,如果您希望它在您的所有项目中都可用,而不仅仅是 projA,它必须在 pom.xml 中。

      【讨论】:

      • 感谢您的回答!我不想将此依赖项添加到 projA 中的所有项目中。有两个以上的项目,所以你的解决方案不能解决我的问题。
      【解决方案4】:

      我遇到了类似的问题:我在我的 settings.xml 中定义了一个属性,并将它用于我的 pom 和我的父 pom 的依赖项中的 systemPaths。忽略“无效”包会导致编译错误,因为类路径中缺少用作传递依赖的包。

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

            添加:

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

            到父 POM 的 dependencyManagement 部分(就像您对 JUnit 所做的那样)。任何需要 log4j 的子节点都可以指定依赖项:

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

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

            【讨论】:

            • 感谢您的回答!我知道它应该可以工作,但它不想工作;/...
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-04
            • 2016-06-19
            • 2016-11-30
            • 2011-04-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多