【问题标题】:how to get a path to a sibling maven project's jar artifact?如何获得兄弟 maven 项目的 jar 工件的路径?
【发布时间】:2014-05-03 17:03:20
【问题描述】:

我有一个基于 java 控制台的应用程序,它被创建为 jar 文件并使用以下命令运行:

java -jar commandlineapp.jar

应用程序是使用 maven 构建的。我有一个 junit 测试项目,它也是一个 Maven 项目,即

parent
+- pom.xml
+- commandlineapp
|  +-pom.xml
+- commandlineapp_test
   +pom.xml

测试项目依赖于命令行应用程序,以确保在运行测试之前构建应用程序。

测试项目有一些使用ProcessBuilder 执行命令行应用程序的junit 单元测试。例如

String jarfile = 
 "C:\\Users\\me\\.m2\\repository\\my\\org\\commandlineapp\\0.0.1-SNAPSHOT\\commandlineapp-.0.1-SNAPSHOT.jar";

ProcessBuilder pb = new ProcessBuilder("java", "-jar", jarFile);

目前,您可以看到我有一个到 commandlineapp jar 文件的硬编码路径。

问题:是否有一些元数据可以用来查找兄弟项目的 jar 路径?理想情况下,除了从 maven 运行单元测试之外,我还希望能够从 eclipse 运行单元测试。

【问题讨论】:

  • JUnit 测试用例存在于它们自己的模块中的任何特殊原因?
  • 我认为测试可能会移到同一个模块中。
  • @Duncan,感谢您的启发。我现在选择相对文件夹 target\classes 作为 ProcessBuilder 的 -cp 参数并直接执行该类,而不是使用 -jar 选项。

标签: java maven junit processbuilder


【解决方案1】:

一种方法是使用测试项目中的maven依赖插件将命令行应用程序(及其依赖项)复制到测试项目中:

     <plugin>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
           <execution>
              <phase>process-test-resources</phase>
              <goals>
                 <goal>unpack-dependencies</goal>
              </goals>
              <configuration>
                 <outputDirectory>${project.build.directory}/lib</outputDirectory>
              </configuration>
           </execution>
        </executions>
     </plugin>

然后在测试项目中,您可以访问目标文件夹:

File testClassesFolder = 
   new File(CommandLineAppTest.class.getClassLoader().getResource(".").getFile());

我们需要用类路径创建一个字符串。类路径

String classPath = testClassesFolder.getParent() + File.separator + "lib";

然后将其传递给 ProcessBuilder:

ProcessBuilder pb = 
  new ProcessBuilder(
     javaExecutablePath, "-cp", classPath, "my.org.CommandLineApp"
  );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-06
    • 2013-07-26
    • 2010-10-10
    • 2020-01-12
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 2016-01-12
    相关资源
    最近更新 更多