【问题标题】:Maven reactor builds in order that doesn't satisfy all dependenciesMaven 反应器的构建顺序不满足所有依赖项
【发布时间】:2015-08-18 08:45:47
【问题描述】:

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

以下是重新创建问题的示例结构(我遇到问题的项目要大得多,>100 个罐子):

pom.xml        [reactor]
parent/pom.xml [parent]
jar1/pom.xml
jar2/pom.xml
jar3/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>
  <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>

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>

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>

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>

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>

我的存储库(在本例中为本地)只有每个 jar 的已发布 1.0 版本,jar3-1.0 依赖于 jar2-1.0,jar2-1.0 依赖于 jar1-1.0,并且每个都有 parent-1.0(我可以发布这个如果需要代码,但我的问题已经很长了,所以除非被问到,否则我会推迟)。

我现在安装上面的 1.1 父 pom,然后尝试在 reactor 上运行安装并得到以下结果。

[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

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

虽然现在因为 jar3-1.1 依赖于 jar2-1.0(在 repo 中),reactor 不会假设需要首先构建 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)

所以我对这个场景有几个问题:
1、为什么maven认为jar3-1.1对jar1-1.1有传递依赖?
2. 为什么reactor没有实现这种传递依赖并按照需要的顺序构建来满足它?
3. 我可以做些什么来防止这个问题发生? (最好不要重写超过 100 个 pom。)

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

1。因为我从未为依赖项定义范围,所以 maven 确定分配了默认范围 compile。因此,从 jar2 到 jar1 的依赖将显示为依赖于 jar2(例如 jar3)的 jar 的传递依赖。 (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 都将存在,因此对于遇到此问题的每个人来说,这可能不是解决方案。 Here is a guide to the scopes available in Maven

【问题讨论】:

    标签: maven maven-3


    【解决方案1】:

    我在这里安装了所有版本设置为1.0 的所有项目。然后我按照你所说的更改了版本,得到了同样的错误。

    将reactor POM 更改为:

     <modules>
        <module>jar1</module>
        <module>jar2</module>
        <module>jar3</module>
    </modules>
    

    ...构建成功。

    我查看了Guide to Working with Multiple Modules, Reactor Sorting,最后一个选项是:

    • &lt;modules&gt; 元素中声明的顺序(如果没有其他规则适用)

    看完下一句:

    请注意,仅使用“实例化”引用 - dependencyManagement 和 pluginManagement 元素不会导致反应器排序顺序发生变化

    • 我恢复了reactor POM
    • 我在parent POM 中评论了&lt;dependencyManagement&gt; 部分,并将@​​987654331@ 明确添加到jar2 和jar3 POM 中

    并且构建成功:

    [INFO] Reactor Build Order
    [INFO]
    [INFO] jar3
    [INFO] jar1
    [INFO] jar2
    [INFO] reactor
    

    【讨论】:

    • 感谢您提供有关反应器如何确定构建顺序的信息!这回答了我仍然困惑的第二个问题。不幸的是,将版本直接放入单个 pom 而不是 dependencyManagement 不是我当前项目的一个选项,但我确实找到了一个使用依赖范围界定的解决方案(并将其编辑到我上面的问题中)。
    【解决方案2】:

    [警告] 在构建有效的过程中遇到了一些问题 com.test.buildorder:jar3:jar:1.1 的模型 [警告] 'parent.relativePath' 指向 com.test.buildorder:reactor 而不是 com.test.buildorder:父级,

    由于您的反应器不是父级,我假设您需要明确定义相对路径

    <parent>
        <groupId>com.test.buildorder</groupId>
        <artifactId>parent</artifactId>
        <version>1.1</version>
        <relativePath>../parent</relativePath>
      </parent>
    

    此外,您还有不同版本的 jar2 1.0 和 1.1。对齐它们

    【讨论】:

    • 我尝试使用 ../parent。这避免了该警告,但它似乎对构建顺序问题没有任何作用。
    • 再次深入研究..您是否有可能存在循环依赖关系? jar3->jar1->jar3 ?
    • 在 jar1 的 pom 中没有依赖,怎么会这样?
    • 从parent中去掉依赖管理部分,并在jar1/2/3中相应定义依赖
    • 虽然在我的示例中这是一个简单的解决方案,但对于我遇到的项目规模而言,这不是一个可行的解决方案。
    【解决方案3】:

    关于问题 2:Maven 反应器排序不适用于传递依赖,它只计算直接依赖:

    • jar3-1.1 依赖于 jar2-1.0(不在反应器中)

    • jar2-1.1 依赖于 jar1-1.1

    • jar1-1.1

    在这种情况下,没有从 jar3-1.1 到 jar1-1.1 的链接

    预计您不会将 reactor 中的 jar2-1.1 与您的 dependencyManagement 中的 jar2-1.0 混合

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-25
      • 2016-07-27
      • 2018-02-02
      • 2012-11-16
      相关资源
      最近更新 更多