【发布时间】: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