可执行jar:执行jar时访问pom的问题

时间:2019-07-08 12:03:22

标签: java maven automation frameworks

我正在尝试为我的Maven-TestNG项目创建一个可执行jar。我的最终目标是仅通过jar文件在任何计算机上执行代码。我的计划是将所有需要的/依赖的jar文件放在一个文件夹中,并将该文件夹作为-classpath传递。

由于可执行jar需要Main类,因此我创建了一个main类并使用InvocationRequest执行目标。作为我目标的一部分,将执行我的TestNG.xml。

InvocationRequest request = new DefaultInvocationRequest();
File file = new File("pom.xml");
File fileWithPath = new File(file.getAbsolutePath());

request.setPomFile(new File(fileWithPath));
request.setGoals(Collections.singletonList("clean verify"));

DefaultInvoker invoker = new DefaultInvoker();
invoker.setMavenHome(new File(System.getenv("M2_HOME")));
try {
    invoker.execute(request);
} catch (MavenInvocationException e) {
    e.printStackTrace();
}

当我从Eclipse执行代码时,上述代码运行良好。

但是,一旦我打包并尝试使用Java -cp lib/* com.test.package.runner.InvokerClassC:\TestProject执行C:\TestProject\lib\pom.xml,它将显示为C:\TestProject\lib\TestProject.jar!\META-INF\maven\com.test.package\TestProject\pom.xml未找到。我知道pom.xml不会出现在jar级别上,而是位于URL path = InvokerClass.class.getClass().getClassLoader().getResource("pom.xml"); URL path = InvokerClass.class.getClass().getClassLoader().getResource("./pom.xml"); URL path = InvokerClass.class.getClass().getClassLoader().getResource("META-INF/maven/com.adp.aca.test/aca-test-regression/pom.xml"); URL path = InvokerClass.class.getClass().getClassLoader().getResource("./META-INF/maven/com.adp.aca.test/aca-test-regression/pom.xml"); 下。

那么如何在运行时从META-INF文件夹中获取pom.xml的路径?

我尝试按以下方式设置pom.xml路径。但是,没有一件事情奏效。有什么建议吗?

大多数时候,由于找不到路径,我得到了nullpointer异常。

LEFT JOIN

1 个答案:

答案 0 :(得分:0)

您可以使用路径中的..准备路径。 它将为您提供所在位置的父目录位置。

  

已更新

假设您的文件夹结构为

C:/my-proj/java/Main.java
C:/my-proj/META-INF/pom.xml

然后,如果要查找pom.xml。您可以执行以下操作

String str = System.getProperty("user.dir");
System.out.println(str+"/../META-INF/pom.xml");

尝试一下。