Java JUnit+;Maven:访问${project.build.directory}值

Java JUnit+;Maven:访问${project.build.directory}值,java,maven,junit,Java,Maven,Junit,在单元测试中,我想在${project.build.directory}内创建一个tmp目录。如何在单元测试中访问${project.build.directory}的值 我可以想到的一种方法是在测试资源中提供一个过滤属性文件,该文件保存该值。(我还没试过,但我觉得应该行得通。) 有没有直接的方法来访问/传递此属性值?请记住,您的单元测试不必从Maven surefire插件执行,因此${project.build.directory}属性可能不可用。为了使您的测试更具可移植性,我建议您使用Fi

在单元测试中,我想在${project.build.directory}内创建一个tmp目录。如何在单元测试中访问${project.build.directory}的值

我可以想到的一种方法是在测试资源中提供一个过滤属性文件,该文件保存该值。(我还没试过,但我觉得应该行得通。)


有没有直接的方法来访问/传递此属性值?

请记住,您的单元测试不必从Maven surefire插件执行,因此
${project.build.directory}
属性可能不可用。为了使您的测试更具可移植性,我建议您使用
File.createTempFile()

如果您按照此处所述配置surefire插件,那么使用系统属性是非常简单的。甚至这里的例子也直接回答了你的问题:

<project>
  [...]
  <build>
    <plugins>
      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-surefire-plugin</artifactId>
         <version>2.9</version>
         <configuration>
           <systemPropertyVariables>
             <propertyName>propertyValue</propertyName>
             <buildDirectory>${project.build.directory}</buildDirectory>
             [...]
           </systemPropertyVariables>
         </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

[...]
org.apache.maven.plugins
maven surefire插件
2.9
财产价值
${project.build.directory}
[...]
[...]

我以前曾成功地使用过类似的方法。即使不使用Maven,单元测试仍将运行,目标目录仍将相对于运行测试的任何位置的cwd创建两个目录

public File targetDir(){
  String relPath = getClass().getProtectionDomain().getCodeSource().getLocation().getFile();
  File targetDir = new File(relPath+"../../target");
  if(!targetDir.exists()) {
    targetDir.mkdir();
  }
  return targetDir;
}

事实上,这就是我们目前所做的,我想改变这一点。我们遇到了一个问题,Hudson上的tmp目录被填满,直到磁盘空间用完。我们正在研究几个选项,一个是将目标目录中的tmp目录作为参数传递给File.createTempFile()。像这样,“mvn clean”将清理所有内容。此外,由于这是一个Maven项目,我认为测试将只使用Maven或支持Maven的IDE运行(此处:Eclipse)。我有另一个反对的理由-我们在Mac和Windows上使用TestContainers时遇到问题-临时文件无法绑定到docker容器中。可能我们可以配置设置系统属性,但不知何故,我不喜欢通过系统属性传递内容的想法。另一方面,您可以说这是特定于环境的(至少是绝对路径)。您认为呢?讨论稍微晚了一点,但是
relPath
并不等于
src/main/java
,因此您肯定需要使用
。/../target