Maven多模块项目执行release时无法找到login资源包的问题
我一眼就看出问题出在Maven Release插件的工作方式上!当你运行mvn clean release:prepare release:perform时,这个插件会在你的项目target目录下创建一个临时的Git克隆副本(一般是target/checkout文件夹),所有的构建操作都是在这个临时副本里完成的。你在原项目目录下用脚本生成的login.properties根本没被复制到这个临时克隆里,所以测试代码在临时构建环境里找不到这个资源包,自然就抛出MissingResourceException了。
为什么constants资源包没问题?因为它本来就在Git仓库里,Release插件在checkout临时代码时会自动把它拉过来,测试自然能找到。
最靠谱的办法是把生成login.properties的步骤整合到Maven的构建生命周期里,这样不管是本地构建还是Release插件的临时构建,都会自动执行这个步骤。我推荐用maven-antrun-plugin来实现,简单又可靠:
在core模块的pom.xml里加上这段插件配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <id>generate-login-properties</id> <!-- 绑定到测试资源处理阶段,确保在测试类编译前生成好文件 --> <phase>process-test-resources</phase> <goals> <goal>run</goal> </goals> <configuration> <tasks> <!-- 直接生成到测试类输出目录,省得还要复制一次 --> <echo file="${project.build.testOutputDirectory}/login.properties"> userName=${bamboo_login_userName} password=${bamboo_login_password} </echo> </tasks> </configuration> </execution> </executions> </plugin>
这么配置之后,每次执行Maven构建(包括Release插件的临时构建),都会在process-test-resources阶段自动生成login.properties到core/target/test-classes目录,测试类就能顺利加载这个资源包了。
另外别忘了,在构建服务器上运行Release命令时,要确保bamboo_login_userName和bamboo_login_password这两个环境变量已经正确设置,这样插件才能读取到值生成正确的文件。
内容的提问来源于stack exchange,提问作者G_hi3

