Java项目的自定义构建生命周期

时间:2017-10-04 23:06:41

标签: java maven gradle ivy

在一个Maven项目上工作,我遇到了一个非常奇怪的依赖循环:有两个maven模块,其中一个是检测Java字节码,同时使用断言(用于单元测试),定义在另一个模块中,该模块又应该由第一个模块进行检测。

所以,它不仅仅是一个循环,它是循环,在maven阶段之间传播。我没有通过重新组织Maven模块来解决它,我怀疑在这种情况下是否可能。

此问题的假设解决方案可能是以下列方式重新构建构建生命周期:

  1. 编译第一个模块的源
  2. 编译第二个模块的源
  3. 使用第一个模块的类
  4. 测量第二个模块
  5. 测试第一和第二个模块
  6. 打包他们
  7. 安装/部署它们
  8. 我怀疑Maven是为这样的黑客而设计的。其他工具怎么样?可以用Gradle或Ivy完成吗?或者也许在Maven中可以使用一些插件?或者问题可能是典型的并且有更直接的解决方案?

    PS:请不要建议概述单独模块的常见依赖关系。如果它如此简单,我就不会在这里。

2 个答案:

答案 0 :(得分:1)

在我看来,你应该看看Gradle这个任务,特别是它的多项目构建。 Gradle允许从任何构建脚本访问任何多项目构建项目中的任务。因此,您应该在子项目中定义所需的任务,并以您想要的任何顺序从根项目中调用它们。

答案 1 :(得分:0)

Gradle提案非常好,但由于内部障碍,我的案例不适用。

对于Maven,我不得不承认在我的情况下将检测代码和测试断言分离到模块是不可能的:它们在构建时太耦合了。因此,我没有尝试在构建时将它们分开,而是在之后设法将它们分开。

注意这个解决方案不是很好的做法:如果你想要分离的类实际上是相互使用的,你可能会在运行时加载类加载异常。此外,在分开的罐子之间不会有任何传递性的解决方案 - Maven会将它们视为完全独立的。

因此,我设法通过遵循以下步骤顺序将检测代码和测试断言分成两个jar工件:

  1. 让它们都在一个Maven模块中。
  2. 对模块的build阶段进行编译和检测,并像往常一样在test阶段进行测试。这不再是问题,因为这个阶段的所有必要事项都位于模块中。
  3. package阶段,配置maven jar插件以使用有限的类文件集收集其他工件。

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <executions>
                <execution>
                    <id>jar-api</id>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <configuration>
                        <classifier>api</classifier>
                        <includes>
                            <include>com/example/api/**</include>
                        </includes>
                    </configuration>
                </execution>
                <execution>
                    <id>jar-codegen</id>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <configuration>
                        <classifier>codegen</classifier>
                        <skipIfEmpty>false</skipIfEmpty>
                        <includes>
                            <include>oo/example/codegen/**</include>
                        </includes>
                    </configuration>
                </execution>
                <execution>
                    <id>jar-tests</id>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <configuration>
                        <skipIfEmpty>false</skipIfEmpty>
                        <classifier>tests</classifier>
                        <includes>
                            <include>com/example/tests/**</include>
                        </includes>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    
  4. install阶段,这些额外的工件将与已组装的模块一起安装到本地存储库。