Maven反应器的构建顺序不能满足所有依赖性

Ben*_*n A 6 maven-3 maven

我在使用Maven的SNAPSHOT构建中进行构建排序时遇到问题。反应堆正在按无效顺序构建所有罐子。

以下是重新创建问题的示例结构(我遇到问题的项目更大,超过100个jar):

pom.xml        [reactor]
parent/pom.xml [parent]
jar1/pom.xml
jar2/pom.xml
jar3/pom.xml
Run Code Online (Sandbox Code Playgroud)

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>
  <packaging>pom</packaging>
  <groupId>com.test.buildorder</groupId>
  <artifactId>reactor</artifactId>
  <version>1.0</version>
  <modules>
    <module>jar3</module>
    <module>jar2</module>
    <module>jar1</module>
  </modules>
</project>
Run Code Online (Sandbox Code Playgroud)

parent / 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>com.test.buildorder</groupId>
  <artifactId>parent</artifactId>
  <version>1.1</version>
  <packaging>pom</packaging>

  <dependencyManagement>
  <dependencies>
      <dependency>
        <groupId>com.test.buildorder</groupId>
        <artifactId>jar1</artifactId>
        <version>1.1</version>
      </dependency>
      <dependency>
        <groupId>com.test.buildorder</groupId>
        <artifactId>jar2</artifactId>
        <version>1.0</version>
      </dependency>
      <dependency>
        <groupId>com.test.buildorder</groupId>
        <artifactId>jar3</artifactId>
        <version>1.1</version>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>
Run Code Online (Sandbox Code Playgroud)

jar1 / 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>com.test.buildorder</groupId>
  <artifactId>jar1</artifactId>
  <version>1.1</version>
  <parent>
    <groupId>com.test.buildorder</groupId>
    <artifactId>parent</artifactId>
    <version>1.1</version>
  </parent>
</project>
Run Code Online (Sandbox Code Playgroud)

jar2 / 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>com.test.buildorder</groupId>
  <artifactId>jar2</artifactId>
  <version>1.1</version>
  <parent>
    <groupId>com.test.buildorder</groupId>
    <artifactId>parent</artifactId>
    <version>1.0</version>
  </parent>

  <dependencies>
    <dependency>
      <groupId>com.test.buildorder</groupId>
      <artifactId>jar1</artifactId>
    </dependency>
  </dependencies>
</project>
Run Code Online (Sandbox Code Playgroud)

jar3 / 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>com.test.buildorder</groupId>
  <artifactId>jar3</artifactId>
  <version>1.1</version>
  <parent>
    <groupId>com.test.buildorder</groupId>
    <artifactId>parent</artifactId>
    <version>1.1</version>
  </parent>

  <dependencies>
    <dependency>
      <groupId>com.test.buildorder</groupId>
      <artifactId>jar2</artifactId>
    </dependency>
  </dependencies>
</project>
Run Code Online (Sandbox Code Playgroud)

我的存储库(在这种情况下为本地)仅具有每个jar的发行版1.0版本,jar3-1.0取决于jar2-1.0,jar2-1.0取决于jar1-1.0且每个都有parent-1.0(如果需要,我可以发布此代码,但我的问题已经很长了,因此除非询问,否则我将推迟。

现在,我在上面安装了1.1父pom,然后尝试在反应堆上运行安装并获得以下结果。

[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.test.buildorder:jar3:jar:1.1
[WARNING] 'parent.relativePath' points at com.test.buildorder:reactor instead of com.test.buildorder:parent, please verify your project structure @ line 6, column 11
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.test.buildorder:jar2:jar:1.1
[WARNING] 'parent.relativePath' points at com.test.buildorder:reactor instead of com.test.buildorder:parent, please verify your project structure @ line 6, column 11
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.test.buildorder:jar1:jar:1.1
[WARNING] 'parent.relativePath' points at com.test.buildorder:reactor instead of com.test.buildorder:parent, please verify your project structure @ line 6, column 11
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] jar3
[INFO] jar2
[INFO] jar1
[INFO] reactor
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building jar3 1.1
[INFO] ------------------------------------------------------------------------
Downloading: https://repo.maven.apache.org/maven2/com/test/buildorder/jar1/1.1/jar1-1.1.jar
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] jar3 ............................................... FAILURE [  0.645 s]
[INFO] jar2 ............................................... SKIPPED
[INFO] jar1 ............................................... SKIPPED
[INFO] reactor ............................................ SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.775 s
[INFO] Finished at: 2015-06-03T16:56:04-05:00
[INFO] Final Memory: 4M/15M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal on project jar3: Could not resolve dependencies for project com.test.buildorder:jar3:jar:1.1: Could not find artifact com.test.buildorder:jar1:jar:1.1 in central (https://repo.maven.apache.org/maven2) -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException
Run Code Online (Sandbox Code Playgroud)

当我构建1.0版本时,Reactor足够聪明,可以实现依赖关系树jar3-1.0-> jar2-1.0-> jar1-1.0并按照jar1,jar2,jar3的顺序进行构建以满足依赖关系。

现在虽然因为jar3-1.1依赖于jar2-1.0(位于回购中),但反应堆并不认为需要先构建jar1,而是调试(使用-X参数)显示依赖关系树为:

[DEBUG] com.test.buildorder:jar3:jar:1.1
[DEBUG]    com.test.buildorder:jar2:jar:1.0:compile
[DEBUG]       com.test.buildorder:jar1:jar:1.1:compile (version managed from 1.0 by com.test.buildorder:parent:1.1)
Run Code Online (Sandbox Code Playgroud)

因此,我对这种情况有一些疑问:
1.为什么Maven认为jar3-1.1具有对jar1-1.1的传递依赖?
2.为什么反应堆没有意识到这种传递依赖关系,并建立了满足它的要求顺序?
3.我该怎么做才能防止此问题的发生?(最好不要重写超过100个pom。)

编辑:找到问题一的答案,以及问题三的一种解决方案。但还是想听听第二个问题。

1。因为我从未为依赖项定义范围,所以maven确定分配的默认范围为compile。因此,从jar2到jar1的依赖性将显示为依赖jar2的jar(例如jar3)的传递性依赖性。 (version managed from 1.0 by com.test.buildorder:parent:1.1)通知我该依赖关系是从jar2-1.0到jar1-1.0,但由于父级为jar 1(1.1)指定了另一个版本,因此需要使用该版本。

3。如果将依赖项的范围从jar2更改为jar1,provided则依赖项不再具有传递性。 假设在运行时所有必需的jar都将存在,因此这可能不是解决遇到此问题的每个人的解决方案。 这是Maven中可用范围的指南

Ger*_*ica 6

我安装了所有项目,并将所有版本设置为1.0此处。然后我按照您所说的更改了版本,并得到了相同的错误。

reactorPOM 更改为:

 <modules>
    <module>jar1</module>
    <module>jar2</module>
    <module>jar3</module>
</modules>
Run Code Online (Sandbox Code Playgroud)

...构建成功。

我查看了《使用多个模块,反应堆排序指南》,最后一个选项是:

  • <modules>元素中声明的顺序(如果没有其他规则适用)

看完下一句话:

请注意,只有“实例”引用使用- dependencyManagementpluginManagement元素不会引起变化到反应器中的排序顺序

  • 我恢复了reactorPOM
  • 我评论了POM中的这一<dependencyManagement>节,并明确地parent添加 <version>jar2和中jar3

并且构建成功:

[INFO] Reactor Build Order
[INFO]
[INFO] jar3
[INFO] jar1
[INFO] jar2
[INFO] reactor
Run Code Online (Sandbox Code Playgroud)