我有一个 maven项目,结构如下
- Root pom.xml
- module1
- module2
module2 是使用Spring Boot注释的集成测试模块 -
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Config.class, webEnvironment = RANDOM_PORT)
module2 依赖 module1 ,当使用 spring-boot-maven-plugin 构建项目时,它会被重新打包并{ module1 中的{3}}; module2 cannot find packages
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
</plugin>
现在的问题是,当运行 module2 集成测试时,无法再找到主类,我猜这是因为 module2 现在正在使用原始工件和不是重新包装的。
目标的执行默认值 org.springframework.boot:弹簧引导Maven的plugin4.6.18.RELEASE:repackag 失败:无法找到主要课程
如何解决这个问题以及在弹簧启动和集成测试时预测结构的最佳做法是什么?
答案 0 :(得分:0)
我用 Maven 配置文件解决了这个问题。在根 pom 中我定义:
<profiles>
<profile>
<id>skip-spring-repackaging</id>
<activation>
<activeByDefault>false</activeByDefault>
<property>
<name>spring.repackage.skip</name>
</property>
</activation>
<modules>
<module>integration-tests</module>
</modules>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<attach>false</attach>
</configuration>
<executions>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</profile>
<profile>
<id>spring-repackaging</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<attach>true</attach>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</profile>
</profiles>
在应用程序 pom 中简单地:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
默认情况下会运行重新打包。集成测试使用单独的 maven 命令运行,我通过 -Dspring.repackage.skip
。
它的缺点是它只适用于单独的 Maven 调用。可能有我不知道的更清洁的解决方案。