https://docs.spring.io/spring-boot/docs/current/maven- plugin/usage.html
我有一个项目,有2个模块。
[Parent] |-pom.xml | [SpringBoot2App] | |-pom.xml | [test] | |-pom.xml (start goal here!)
我想在另一个模块的单独项目中运行集成测试(Maven故障安全插件)。
在父模块的集成测试期间,可以配置spring boot maven插件来启动/停止子模块吗?
我尝试这样的事情没有成功
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>com.SimpleServiceApplication</mainClass> <classesDirectory>../SpringBoot2App/target/classes</classesDirectory> <folders> <param>../SpringBoot2App/target/test-classes</param> </folders> </configuration> <executions> <execution> <goals> <goal>start</goal> </goals> <phase>pre-integration-test</phase> </execution> </executions> </plugin>
哪个不起作用。
在阅读插件的超类的源https://github.com/spring-projects/spring-boot/blob/master/spring- boot-project/spring-boot之后,我还尝试添加“ project”参数 -工具/spring-boot-maven- plugin/src/main/java/org/springframework/boot/maven/AbstractRunMojo.java
<configuration> <mainClass>com.SimpleServiceApplication</mainClass> <project>${project.parent.collectedProjects[0]}</project> </configuration>
如调试所示,这是指正确的项目,但也不起作用。
请不要对[0]进行评论,我知道[0]并不干净,并且是需要直接了解父pom模块排序的耦合。
我在org / springframework / boot / SpringApplication上收到java.lang.NoClassDefFoundError
我将starter-web项目添加到测试pom.xml,结果相同
我认为无法使用来对另一个模块进行集成测试spring-boot-maven- plugin,因为start目标似乎并未给您提供从本地存储库或Maven反应器解析应用程序的方法,而这可能正是您想要的。project您尝试使用的配置属性并非旨在以这种方式覆盖。只能使用插件目标文档中列出的属性来配置插件执行。
spring-boot-maven- plugin
start
project
相反,我认为您至少有两种可能的方法:
为此,我认为您需要一种在您想要运行的服务器工件中复制的方法,以及一些用于启动和停止它的更常规的方法,例如cargo- maven2-plugin或process-exec-maven- plugin。
只需repackage在服务器工件构建中配置目标:
repackage
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludeDevtools>true</excludeDevtools> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin>
然后,从集成测试模块中,您可以执行以下操作:
<plugin> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-server-artifact</id> <goals> <goal>copy</goal> </goals> <phase>pre-integration-test</phase> <configuration> <artifactItems> <artifactItem> <groupId>${project.groupId}</groupId> <artifactId>SpringBoot2App</artifactId> <version>${project.version}</version> <classifier>jar</classifier> <outputDirectory>${project.build.directory}</outputDirectory> <destFileName>app.jar</destFileName> </artifactItem> </artifactItems> </configuration> </execution> </executions> </plugin> <plugin> <groupId>com.bazaarvoice.maven.plugins</groupId> <artifactId>process-exec-maven-plugin</artifactId> <version>0.7</version> <executions> <execution> <id>start-server</id> <phase>pre-integration-test</phase> <goals> <goal>start</goal> </goals> <configuration> <name>run-server</name> <waitForInterrupt>false</waitForInterrupt> <healthcheckUrl>http://localhost:8080</healthcheckUrl> <arguments> <argument>java</argument> <argument>-jar</argument> <argument>${project.build.directory}/app.jar</argument> </arguments> </configuration> </execution> <execution> <id>stop-server</id> <phase>post-integration-test</phase> <goals> <goal>stop-all</goal> </goals> </execution> </executions> </plugin>
只需在测试工件上声明对服务器工件的正常Maven依赖关系,然后@SpringBootApplication在进行钩子或其他操作之前在JUnit中运行服务器的类,例如
@SpringBootApplication
private static ConfigurableApplicationContext context; @BeforeClass public static void setUp() { context = new SpringApplicationBuilder(SimpleServiceApplication.class).run(); } @AfterClass public static void tearDown() { if (context != null) { context.close(); } }
这可能足以满足您的需求。