Maven:多模块顺序

Posted

技术标签:

【中文标题】Maven:多模块顺序【英文标题】:Maven : Multi Module order 【发布时间】:2020-07-31 18:39:42 【问题描述】:

我正在创建一个多模块 maven 项目,我想要的模块执行顺序是 Parent、Child1Plugin、Child、Child2。 Child1Plugin 还具有 CHild2 的依赖项。但到目前为止,反应器正在运行以下模块顺序:

**Reactor Summary:**
[INFO] parent 0.0.1-SNAPSHOT .............................. SUCCESS [  0.387 s]
[INFO] Child2 ............................................. SUCCESS [  2.768 s]
[INFO] Child1Plugin ....................................... SUCCESS [  1.182 s]
[INFO] Child 0.0.1-SNAPSHOT ............................... SUCCESS [  0.102 s]

***Parent:***
<groupId>com.io</groupId>
  <artifactId>ParentMod</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
  <name>parent</name>
  <description>Thisisparent</description>
  
  <modules>
    <module>Child1Plugin</module>
    <module>Child</module>
    <module>Child2</module>
  </modules>
  
  <properties>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
</properties>
</project>

**Child1Plugin**

@Mojo(name = "dependency-counter", defaultPhase = LifecyclePhase.COMPILE)
public class DependencyCounterMojo extends AbstractMojo
    public void execute() throws MojoExecutionException, MojoFailureException 
       System.out.println("$$$$$$$$$$$$$$ ....Mojo execution begins.... $$$$$$$$$$$$$$");
        GenerateFeature ob=new GenerateFeature();
        ob.generationFeature();
    
  Pom.xml:
    <parent>
        <groupId>com.io</groupId>
        <artifactId>ParentMod</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>Child1Plugin</artifactId>
    <packaging>maven-plugin</packaging>

    <dependencies>
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-plugin-api</artifactId>
            <version>3.6.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugin-tools</groupId>
            <artifactId>maven-plugin-annotations</artifactId>
            <version>3.6.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-project</artifactId>
            <version>2.2.1</version>
        </dependency>
        <dependency>
            <groupId>com.io</groupId>
            <artifactId>Child2</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>

   **Child2**
 public class GenerateFeature 
 public void generationFeature() 
    System.out.println("$$$$$$$$$$$$$$ ....I am generating feature files");
  Pom.xml:
     <parent>
        <groupId>com.io</groupId>
        <artifactId>ParentMod</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>Child2</artifactId>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>info.cukes</groupId>
            <artifactId>cucumber-java</artifactId>
            <version>1.2.5</version>
        </dependency>
    </dependencies>

  **Child**
    <parent>
        <groupId>com.io</groupId>
        <artifactId>ParentMod</artifactId>
        <version>0.0.1-SNAPSHOT</version>
      </parent>
      <artifactId>Child</artifactId>
      
      <build>
      <plugins>    
            <plugin>
                <groupId>com.io</groupId>
                <artifactId>Child1Plugin</artifactId>
                <version>0.0.1-SNAPSHOT</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>dependency-counter</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <scope>test</scope>
                </configuration>
            </plugin>
            </plugins>
      </build>

使用上面的模块,我尝试首先使用 module-Child1Plugin 安装插件,然后使用 module-Child 调用目标,最后使用 module-Child2 运行我的黄瓜测试。但是反应器产生了不同的顺序,因此我无法实现我想要的。

【问题讨论】:

如果Child1Child2有依赖,那么Child2必须在Child1之前执行。如果您想在Child1Child2 之后运行测试,则将它们移动到一个单独的模块并让新模块依赖于Child1Child2。然而,实际的问题是:为什么Child2 中的测试需要Child1?这似乎是错误的。 我希望顺序如下: 1. Child1Plugin(这会安装插件) 2. Child(这会调用在步骤 1 中使用插件创建的目标/mojo) 3. Child2(这会调用我的测试) 再次:如果Child1 依赖于Child2,则必须先编译Child2。这是依赖图的直接结果。如果必须反过来执行,则必须反转依赖关系。 是的 child2 比 child1 先运行,这就是我在反应器摘要结果中发布的内容,但我希望结果按顺序排列:1. Child1Plugin(这会安装插件) 2. Child(这会调用在步骤 1 中使用插件创建的目标/mojo)3. Child2(这会调用我的测试) 我刚刚告诉过你:如果你想让Child1先运行,那么你必须反转依赖。如果Child2 依赖于Child1,则Child1 将首先执行。但是,这需要删除从 Child1Child2 的依赖关系,因为 maven 无法处理循环依赖关系。 【参考方案1】:

如果 A 依赖于 B,则 B 必须在 A 之前构建。

这不仅仅是一个 Maven 规则,它是一个常识性规则。

否则,A 的构建会因为 B 不存在而中断。

因此,以所述方式,无法使用 Maven 或任何遵循基本逻辑的构建工具来实现所需的行为。

【讨论】:

我想我现在必须改变结构.. 但你能建议我如何实现以下内容:1. 模块 A 安装我的自定义插件 2. 模块 B 使用我的自定义插件(调用 mojo)从不同的项目(模块 C)中调用一个类 3. 模块 C 现在在 A 和 B 之后运行以运行一些 JUnit 测试。这是我尝试使用多模块方法创建的流程。 如果 B 使用 C,但 C 应该在 B 之后运行,这是不可能的。请退后一步,你走错了方向。我完全确定您的真正的问题 有解决方案,但您的订购问题没有解决方案。拿一张纸,写下需要运行的内容,然后找出一组执行此操作的模块。 模块A应该安装插件基本上是错误的,因为模块没有安装插件。它生成一个工件。这个工件可以是一个插件。为了确保工件在使用它之前构建,您必须定义对它的依赖关系。并且已经存在问题。定义对插件的依赖是没有意义的,使用插件不会影响反应器的构建顺序。问题就在这里:模块 B 是一种测试吗?如果是这样,您的设置是错误的,将无法正常工作。 我可以创建两个单独的项目并放置一个依赖项而不创建父模块并执行它们...项目1(插件)和项目2(我需要执行的类)。 独立项目之间可以有依赖关系。但是,如果 A 依赖于 B,则需要先构建 B,然后才能构建 A。

以上是关于Maven:多模块顺序的主要内容,如果未能解决你的问题,请参考以下文章

笔记:Maven 反应堆

限时免费Maven高级教程之多模块管理

Maven使用Maven构建多模块项目

Maven管理多模块

Maven管理多模块

Maven使用Maven构建多模块项目