我想知道这是否是构建项目的正确方法以及如何配置它以便我可以从单个构建命令构建/测试/打包其所有单个组件?
我有一个包含多个模块的Maven项目 - Spring应用程序和一个"库"他们之间共享作为依赖。我希望能够与库一起构建所有应用程序,以便我可以在任何模块更改(lib或app)时执行集成测试。
理想情况下,我应该能够编译每个组件,对每个app /库运行单元测试,运行集成测试,将每个组件打包到其可执行jar中。在某些时候,此过程将在具有更高级别系统测试的Jenkins服务器上运行。
现在,我正在使用mvn clean install spring-boot:repackage
。这适用于每个应用程序,即。从Main Project/App1/
开始运行时。但是,当我从项目根Main Project/
运行它时,我收到一个错误,即库不能弹簧重新包装,因为库没有主类。这很好 - 它是一个库,它不需要入口点。
这是在Maven中构建多应用程序项目的正确方法,还是我做错了什么?
项目结构是:
Main Project
|-SharedLibrary/
|-src/
|-pom.xml
|-App1/
|-src/
|-pom.xml
|-App2/
|-src/
|-pom.xml
|-App3/
|-src/
|-pom.xml
|-pom.xml
答案 0 :(得分:1)
不要在命令行上运行目标,而是考虑将Spring Boot maven plugin repackage goal的配置添加到POM。如果添加了配置,则重新打包将作为mvn clean install
命令的一部分运行。
首先,将插件添加到pluginManagement
部分中的父POM中。这将确保Spring引导版本对所有模块都是一致的。
<pluginMangement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>YourSpringBootVersion</version>
</plugin>
</plugins>
</pluginMangement>
然后将repackage
目标添加到Spring Boot模块的POM中。根据文档,目标默认绑定到阶段package
。
<plugins>
<plugin>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>spring-boot-repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
或者,由于应用程序在4个模块中的3个模块中使用repackage
,因此您可以将上述配置添加到父模块中。但是,这样做会执行我们知道不起作用的所有模块的插件目标。所以,如果你选择这个选项,那么你需要告诉插件而不是在库中运行:
<plugins>
<plugin>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>spring-boot-repackage</id>
<phase>none</phase>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
请注意添加<phase>none</phase>
。这会仅禁用此模块的插件目标。