【问题标题】:Executable Jar : Issue in accessing pom while executing jarExecutable Jar:执行 jar 时访问 pom 的问题
【发布时间】:2019-11-17 22:41:30
【问题描述】:

我正在尝试为我的 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 执行上面的代码时,它运行良好。

但是一旦我进行打包并尝试使用 C:\TestProject 执行 Java -cp lib/* com.test.package.runner.InvokerClass ,它显示为 C:\TestProject\lib\pom.xml 未找到。我知道 pom.xml 不会出现在 jar 级别,而是在 C:\TestProject\lib\TestProject.jar!\META-INF\maven\com.test.package\TestProject\pom.xml 下。

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

我尝试以不同的方式设置 pom.xml 路径,如下所示。但没有什么效果很好。请问有什么建议吗?

大多数时候,我得到空指针异常,因为它找不到路径。

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");

【问题讨论】:

  • 为什么不直接创建一个uber jar(包含所有依赖项的jar)然后使用它呢?可以参考this
  • 问题不在于访问 jar。由于 pom.xml 位于 META-INF 文件夹中,因此问题无法在执行 jar 时将 pom.xml 指向 Main 类。
  • 让我们后退一步。你想解决什么问题?您的问题似乎表明您只需要一罐罐子就可以解决问题。而不是你试图创建一个 jar 文件来访问类路径中的其他 jar,然后读取它们的 pom 文件,然后用它做一些事情,如果你只是创建一个 uber jar(这是一个包含所有它需要作为一个大胖罐子的依赖项)并使用它?

标签: java maven automation frameworks


【解决方案1】:

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

更新

假设你的文件夹结构如下

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");

试试这个。

【讨论】:

  • 即使更新不起作用也不会起作用。因为 pom.xml 将位于像 C:\TestProject\lib\TestProject.jar!\META-INF\maven\com.test.package\TestProject\pom.xml 这样的 jar 文件中
  • String str = System.getProperty("user.dir"); System.out.println(str);你在 str 中看到了什么?
  • 它打印C:\TestProject,如果我打印str+"/../META-INF/maven/com.test.package/TestProject/pom.xml",它打印C:\TestProject\..\META-INF\maven\com.test.package\TestProject\pom.xml
  • 好的,我想你可以在这个位置找到 pom 文件。字符串 str = System.getProperty("user.dir"); System.out.println(str+"/META-INF/maven/com.test.package/TestProject/pom.xml");
  • 找不到...pom.xml.jar 文件中,不在文件夹中。
猜你喜欢
  • 1970-01-01
  • 2019-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 2023-03-07
  • 2019-07-04
  • 2013-06-22
相关资源
最近更新 更多