我正在尝试为我的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.InvokerClass
从C:\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
答案 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");
尝试一下。