是标签&#34; <optional>&#34;在dependencyManagement元素中有效吗?</optional>

时间:2014-05-12 14:07:01

标签: java maven maven-3 dependency-management

我对于optional dependencies的机制在Maven中是如何工作有点困惑。 似乎可选的依赖项仅在直接指定时才起作用,而不是通过依赖项管理。


我创建了三个测试项目p1-p3,带有依赖项:

  • p3取决于p2
  • p2取决于p1

如果我在 <dependencies> 元素中声明依赖项为可选项,则此按预期方式工作。 p2的POM:

<dependencies>
  <dependency>
    <groupId>testgroup</groupId>
    <artifactId>p1</artifactId>
    <version>1.0-SNAPSHOT</version>
    <optional>true</optional>
  </dependency>
</dependencies>

结果:p3的构建会拉入p2,但不会 p1。

但是,如果我如果在 <dependencyManagement> 元素中将依赖项声明为可选项,则似乎会被忽略。 p2的POM:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>testgroup</groupId>
      <artifactId>p1</artifactId>
      <version>1.0-SNAPSHOT</version>
      <optional>true</optional>
    </dependency>
  </dependencies>
</dependencyManagement>

<dependencies>
  <dependency>
    <groupId>testgroup</groupId>
    <artifactId>p1</artifactId>
  </dependency>
</dependencies>

结果:p3的构建会拉入p2 p1。


这是预期的行为吗?我无法在任何地方找到这些文件。

注意:

  • 使用Maven 3.0.3和3.2.1进行测试。
  • 要查看p3的构建是否使用了p1,我检查了mvn dependency:tree的输出和mvn -X列出的类路径(结果相同)。
  • 我还尝试将<dependencyManagement>元素放入p1的POM中,而不是p2。结果是一样的,即<optional>没有效果。

1 个答案:

答案 0 :(得分:5)

报告为MNG-1630。虽然已关闭为“固定&#39;”,a comment suggests

  

实际上,这个问题从未修复过。在r354544中提交的更改不足,因为它们既不更新DefaultArtifactCollector也不更新DefaultModelDefaultsInjector,以将可选标志从托管依赖项/工件转换为项目依赖项。

您现在已经打开了此问题的副本(MNG-5632),要求进行行为或文档更改,这似乎是跟踪此问题的理想方式。