我有一个使用maven进行构建管理的java应用程序。
当我使用
运行生成的应用程序jar时java -jar myjar
应用程序生成的输出文件最终会出现在项目根目录中。所以,如果我在/ my / project / dir中执行jar并创建一个文件写入器来写入logs / mylog
生成的文件最终在
中/my/project/dir/logs/mylog
完全符合预期。
但是: 当maven surefire插件执行单元测试时,文件最终会出现在模块目录中。 假设我在/ my / module中编译了一个maven项目。
编译的文件最终在/ my / module / target / classes中。 当maven通过单元测试执行这些类时,相同类的输出最终会在
中执行/my/module/logs/mylog
我希望文件最终在目标目录中
/my/module/target/logs/mylog
因为这是类文件所在的位置。
所以我正在寻找一种方法来配置maven surefire来定义java类的根目录以指向目标而不是模块目录。
编辑: 我发现这篇文章: Maven: change the directory in which tests are executed 这似乎试图解决我的问题。但是,如果我将workingdirectory设置为我的目标目录,则测试将无法再找到我的资源,即使它们已从模块$ {basedir}复制到$ {basedir} / target
答案 0 :(得分:1)
您应该将应用程序的工作目录设置为./target(或以Maven属性方式:$ {project.build.directory})
答案 1 :(得分:1)
解决方案: 默认情况下,maven surefire插件在模块主目录中执行其测试。 为了避免这种情况,请将插件的工作目录设置为目标目录。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>...</version>
<configuration>
<workingDirectory>${project.build.directory}</workingDirectory>
<basedir>${project.build.directory}</basedir>
</configuration>
</plugin>
请注意,如果测试依赖于基于模块的root的某些资源,则需要复制这些资源。我能找到的最简单的方法是使用资源插件。
<build>
<resources>
<resource>
<directory>dependency</directory>
<targetPath>${project.build.directory}/dependency</targetPath>
</resource>
...
</build>
答案 2 :(得分:0)
我可以给你一个关于使用什么的提示。
Maven profiles可以在有选择地启用时改变Maven的来源和行为。
配置文件专门用于执行您想要执行的操作。