【问题标题】:Maven: How to run module before building other modules in multi-module project?Maven:如何在多模块项目中构建其他模块之前运行模块?
【发布时间】:2017-01-18 13:12:46
【问题描述】:

我有一个 Maven POM 项目,其中包含许多模块。

其中一个是其他一些模块使用的 REST Web 服务。 这个模块是一个独立的可执行文件。

我想要实现的是让 Web 服务在所有其他模块之前构建和运行。

我知道只需更改 pom 文件中模块的顺序,我就可以让模块先于其他模块构建,但是在构建其余模块之前如何运行它呢?

我需要运行它,以便我可以执行包含在其余模块中的一系列测试。

我尝试实现这种功能的原因是因为我最终要做的是让项目在 Jenkins 上正确构建和测试。

【问题讨论】:

  • 如果您的测试需要一个正在运行的 REST 服务,他们应该启动它(或确保它正在运行)。这是一个测试先决条件。
  • 我不确定我是否理解您的建议。可能我也必须更新我的问题。该服务是一个独立的可执行文件。测试将测试他们是否可以从服务中获得预期的结果。还会有一个测试,该服务将无法正常工作,但在这种情况下,我想我可以使用一个错误的 url?
  • 你的 REST 部分的测试应该在 REST 模块中实现,或者作为单元测试或集成测试......通过订购模块来定义顺序是完全错误的..更好地定义模块之间的依赖关系,这会导致构建顺序...
  • 依赖项确实存在。 REST 服务也可以有自己的测试,但我仍然需要测试我是否真的能够检索和处理其他模块中的数据。此外,为了正确执行其他模块,还需要检索到的数据。如果没有正在运行的 Web 服务,我将无法测试其他模块。不幸的是,该项目太大而无法发布有关其内部运作的详细信息。

标签: java maven jenkins


【解决方案1】:

我知道只需更改 pom 文件中模块的顺序,我就可以让模块先于其他模块构建,但是在构建其余模块之前如何运行它?

模块的顺序将不一定按该顺序构建它们。如果一个模块依赖于另一个模块,那么您必须通过依赖项目的 pom 中的 <dependency> 处理它。 要回答您的问题,请先构建 REST 服务模块并将其部署到您的服务器/容器。在多模块项目中,像mvn somegoal 这样的运行命令将在所有模块上运行somegoal

要在模块上运行不同的目标,请分两步尝试
mvn -pl module1 somegoal
mvn -pl module2 someothergoal
在您的项目中,它们将采用以下形式 mvn -pl RESTModule deploy 后跟通常 mvn 命令用于运行其他模块的测试。记住这些的 -pl 选项。 编辑:在查看了您评论中的要求后,我尝试了另一种解决方案。也可能对你有用。将 maven-deploy-plugin 添加到 REST Module 的 pom 并将其绑定到一个阶段,以便只有 RESTModule 项目部署工件,而不是其他项目(因为他们的 pom 中没有这样的插件)。要添加的 sn-p。 `

<project>

    <build>

        <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-deploy-plugin</artifactId>
                <version>2.8.2</version>
                <executions>                                                 
                <execution>     
                <id>MyProjId</id>                                         
                    <phase>package</phase>                              
                    <goals>                                              
                        <goal>deploy</goal>                             
                    </goals>                                                                               
                </execution>                                             
            </executions>
              </plugin>


    </build>
    <distributionManagement>
        <repository>
          <id>my-repository</id>
          <url>http://path/to/your/repo</url>
        </repository>
      </distributionManagement>

</project>

并使用 jenkins 中的父 pom 运行项目。

【讨论】:

  • 正如我在上面的 cmets 中所说,我在每个单独的 pom 文件中设置了依赖项。我想我应该从我的描述中删除这句话。我想做的是每次我提交更改时都能够在 Jenkins 上构建项目(更改提交给 Gitlab 并触发 Jenkins 上的构建)。因此,我需要以这样一种方式设置项目,即构建所有内容所需要做的唯一事情就是实际构建父模块。那可能吗?您认为唯一的方法是将 Web 服务构建为单独的模块吗?
  • 你现在可以检查和评论。不确定SO是否会通知答案编辑@Arch
  • 感谢您的帮助@Abhi7950,我能够使用 mvn 测试命令行解决方案并且它有效,我不确定我将如何在 Jenkins 中使用这种方法,但现在它看起来像切实可行的选项。我也会尝试测试您更新的建议。
  • 以防万一有人感兴趣,我不得不提一下,我使用了 tomcat 插件,以便能够在我的本地 tomcat 服务器上正确编译和加载服务。
猜你喜欢
  • 2022-08-03
  • 2021-03-23
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 2019-07-11
  • 2014-03-03
  • 2017-01-29
  • 2014-05-22
相关资源
最近更新 更多