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

Maven:如何将应用程序输出限制到目标目录,maven,Maven,我有一个java应用程序,它使用maven进行构建管理 当我运行生成的应用程序jar时 java -jar myjar 应用程序生成的输出文件最终位于项目根目录中。因此,如果我在/my/project/dir中执行jar并创建一个filewriter来写入logs/mylog 生成的文件以 /my/project/dir/logs/mylog /my/module/logs/mylog 一如所料 然而: 当maven surefire插件执行单元测试时,文件最终位于模块目录中。 假设我在/

我有一个java应用程序,它使用maven进行构建管理

当我运行生成的应用程序jar时

java -jar myjar
应用程序生成的输出文件最终位于项目根目录中。因此,如果我在/my/project/dir中执行jar并创建一个filewriter来写入logs/mylog

生成的文件以

/my/project/dir/logs/mylog
/my/module/logs/mylog
一如所料

然而: 当maven surefire插件执行单元测试时,文件最终位于模块目录中。 假设我在/my/module中编译了一个maven项目

编译后的文件最终位于/my/module/target/classes中。 当maven通过单元测试执行这些类时,相同类的输出以

/my/project/dir/logs/mylog
/my/module/logs/mylog
我想文件结束在目标目录一样

/my/module/target/logs/mylog
因为这是类文件所在的位置

因此,我正在寻找一种方法来配置maven surefire,以定义java类的根目录,从而指向目标,而不是模块目录

编辑: 我发现这个帖子:
这似乎试图解决我的问题。但是,如果我将workingdirectory设置为my target dir,测试将无法再找到我的资源,即使它们是从模块${basedir}复制到${basedir}/target

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

我不能确切地告诉你如何做你需要做的事情,因为没有真正的信息 我可以给你一个关于使用什么的提示

当有选择地启用Maven时,Maven可以更改其源代码和行为

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

解决方案: 默认情况下,maven surefire插件在modules主目录中执行其测试。 为了避免这种情况,将插件的workingdirectory设置为目标目录

<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>

org.apache.maven.plugins
maven surefire插件
...
${project.build.directory}
${project.build.directory}
注意,如果测试依赖于模块basedir中root的某些资源,则需要复制这些资源。我能找到的最简单的方法是使用资源插件

<build>
    <resources>
        <resource>
            <directory>dependency</directory>
            <targetPath>${project.build.directory}/dependency</targetPath>
        </resource>
...
</build>

附属国
${project.build.directory}/dependency
...

这还不清楚,你在说什么
日志
?它们来自哪里,是什么创建了它们?我的应用程序在maven之外作为jar运行时,将其日志文件等放在项目根目录中。这是设计好的,不是问题。但是,当MAVEN执行该程序时,文件最终会出现在modules root dir中,而不是类文件所在的target中。我如何修复它?您如何运行应用程序?您是使用maven来运行它还是只使用java-jar。。。或者其他什么?两者都有:当我使用java-jar运行时,文件最终会出现在应用程序根目录中。当我使用maven运行时,相同的文件会出现在maven模块目录中(POM、src、target等位于该目录中),我希望配置maven,使这些文件出现在target而不是Module目录中。这需要我对应用程序本身进行更改。该项目不会在生产中的maven内部运行,因此这将是一个麻烦的解决方案。我以前的表述非常不清楚。我已经编辑了我的问题。你用什么插件通过Maven“运行”你的应用程序?实际上,这里不需要配置文件。Maven应该始终将应用程序根目录定向到此项目中的目标。