Maven:如何将应用程序输出限制在目标目录中

时间:2013-09-18 07:37:44

标签: maven

我有一个使用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

3 个答案:

答案 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的来源和行为。

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