更改 Maven 故障安全预集成测试的工作目录以查找 Spring 配置
Change working directory for Maven failsafe pre-integration-test to find Spring configuration
我们有一个多模块 Maven 项目,里面有多个可执行项目。
目录结构类似于:
parent
+- module1
+-- src/main/resources/application.yml
+-- config/bootstrap.yml
+-- config/application-dev.yml
+-- config/application-prod.yml
+-- pom.xml
+- pom.xml
其中 application.yml
是非特定环境的打包默认值,config
文件夹中的所有文件属于仅本地开发所需的外部配置,不属于 WAR 文件。
现在,如果我从 IDE 启动应用程序或测试,它会按预期工作。另外,如果我 运行 Maven 在 module1
文件夹中构建。但是,如果我尝试构建父项目,则找不到 bootstrap.yml
,它在 pre-integration-test
阶段构建失败。
我发现工作目录设置为父文件夹而不是 module1
,这似乎是问题所在,因为 Spring 在 .
和 ./config
中查找。如果我将配置文件夹复制到根目录,它在所有情况下都有效。
在 Spring 上下文查找配置的 pre-integration-test
阶段,有什么方法可以告诉 Maven 故障保护将工作目录设置为模块文件夹?
parent/pom.xml
:
<project ...>
<properties>
<maven.version>3.0.0</maven.version>
<maven-surefire-plugin.version>2.18.1</maven-surefire-plugin.version>
<maven-failsafe-plugin.version>2.20.1</maven-failsafe-plugin.version>
</properties>
<modules>
<module>module1</module>
</modules>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>${maven-failsafe-plugin.version}</version>
<configuration>
<runOrder>alphabetical</runOrder>
<includes>
<include>**/*IntTest.java</include>
</includes>
<skipTests>${skipTests}</skipTests>
</configuration>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
parent/module1/pom.xml
:
<project>
<parent>
...
</parent>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
</plugin>
</plugins>
</plugins>
</build>
</project>
好的,由于某些原因,maven-failsafe-plugin
的 <config>
块中的 <environmentVariables>
和 <systemProperties>
不能与 spring-boot-maven-plugin
组合使用。
似乎 spring-boot 插件负责在 pre-integration-test
阶段创建(分叉的)JVM 因为这个片段:
<execution>
<id>pre-integration-test</id>
<goals>
<goal>start</goal>
</goals>
</execution>
我通过配置 spring-boot-maven-plugin
解决了这个问题:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<workingDirectory>${basedir}</workingDirectory>
根据文档 ${basedir}
应该是默认值,但它可能不适用于 Maven 多模块项目。
我们有一个多模块 Maven 项目,里面有多个可执行项目。
目录结构类似于:
parent
+- module1
+-- src/main/resources/application.yml
+-- config/bootstrap.yml
+-- config/application-dev.yml
+-- config/application-prod.yml
+-- pom.xml
+- pom.xml
其中 application.yml
是非特定环境的打包默认值,config
文件夹中的所有文件属于仅本地开发所需的外部配置,不属于 WAR 文件。
现在,如果我从 IDE 启动应用程序或测试,它会按预期工作。另外,如果我 运行 Maven 在 module1
文件夹中构建。但是,如果我尝试构建父项目,则找不到 bootstrap.yml
,它在 pre-integration-test
阶段构建失败。
我发现工作目录设置为父文件夹而不是 module1
,这似乎是问题所在,因为 Spring 在 .
和 ./config
中查找。如果我将配置文件夹复制到根目录,它在所有情况下都有效。
在 Spring 上下文查找配置的 pre-integration-test
阶段,有什么方法可以告诉 Maven 故障保护将工作目录设置为模块文件夹?
parent/pom.xml
:
<project ...>
<properties>
<maven.version>3.0.0</maven.version>
<maven-surefire-plugin.version>2.18.1</maven-surefire-plugin.version>
<maven-failsafe-plugin.version>2.20.1</maven-failsafe-plugin.version>
</properties>
<modules>
<module>module1</module>
</modules>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>${maven-failsafe-plugin.version}</version>
<configuration>
<runOrder>alphabetical</runOrder>
<includes>
<include>**/*IntTest.java</include>
</includes>
<skipTests>${skipTests}</skipTests>
</configuration>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
parent/module1/pom.xml
:
<project>
<parent>
...
</parent>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
</plugin>
</plugins>
</plugins>
</build>
</project>
好的,由于某些原因,maven-failsafe-plugin
的 <config>
块中的 <environmentVariables>
和 <systemProperties>
不能与 spring-boot-maven-plugin
组合使用。
似乎 spring-boot 插件负责在 pre-integration-test
阶段创建(分叉的)JVM 因为这个片段:
<execution>
<id>pre-integration-test</id>
<goals>
<goal>start</goal>
</goals>
</execution>
我通过配置 spring-boot-maven-plugin
解决了这个问题:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<workingDirectory>${basedir}</workingDirectory>
根据文档 ${basedir}
应该是默认值,但它可能不适用于 Maven 多模块项目。