0

我有一个使用 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:更改执行测试的目录 这似乎试图解决我的问题。但是,如果我将工作目录设置为我的目标目录,测试将无法再找到我的资源,即使它们是从模块 ${basedir} 复制到 ${basedir}/target

4

3 回答 3

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>

请注意,如果测试依赖于模块 basedir 中具有 root 的某些资源,则需要将它们复制过来。我能找到的最简单的方法是使用资源插件。

<build>
    <resources>
        <resource>
            <directory>dependency</directory>
            <targetPath>${project.build.directory}/dependency</targetPath>
        </resource>
...
</build>
于 2013-09-19T11:40:20.753 回答
1

您应该将您的应用程序工作目录设置为 ./target(或以 Maven 属性方式:${project.build.directory})

于 2013-09-18T07:48:42.333 回答
0

我不能确切地告诉你如何做你需要做的,因为没有真实的信息

我可以给你一个关于使用什么的提示。

当有选择地启用Maven配置文件时,它们可以更改 Maven 的来源和行为。

配置文件专门设计用于执行您想要执行的操作。

于 2013-09-18T09:07:21.080 回答