【发布时间】:2018-01-20 09:35:08
【问题描述】:
我有一个尝试从命令行运行的 maven java 项目。该项目是使用 Netbeans 8.1 构建的。它使用 maven-dependency-plugin 和 maven-jar-plugin 构建为 java-snap-2.0.jar。
在我的根/目标目录中,我找到了一个 lib/ 目录,其中包含我的项目依赖项所需的所有 .jar。例如,我有一个 snap-core-6.0.0-SNAPSHOT.jar,其中包含 org/esa/snap/core/datamodel/Product.class 。在我的可执行 jar 中,我有一个 META-INF/MANIFEST.MF 文件,其中包含 lib/ 目录中 jar 文件的空格分隔路径列表,包括 lib/snap-core-6.0.0 -20170810.175327-200.jar。
尽管如此,当我像这样从命令行运行 jar 文件时:java -jar java-snap-2.0.jar argument1, argument2 ... argumentN,我收到以下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: org/esa/snap/core/datamodel/Product
at com.batchprocessing.java.snap.ProcessMultiTemporal.main(ProcessMultiTemporal.java:56)
at com.batchprocessing.java.snap.Main.ProcessMultiTemporalHPC(Main.java:178)
at com.batchprocessing.java.snap.Main.main(Main.java:189)
Caused by: java.lang.ClassNotFoundException: org.esa.snap.core.datamodel.Product
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 3 more
这是 pom.xml 文件的摘录:
(...)
<build>
<plugins>
<!-- Copy dependencies during package phase to root/lib directory -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib/</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<!-- Build an executable JAR and add classpaths (in lib/) to manifest -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.batchprocessing.java.snap.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
(... other plugins ...)
</build>
(...)
非常感谢您能帮我解决这个问题。通过从 IDE 运行它,我已经使用该应用程序一年了,但我希望能够从命令行运行它并将其移动到其他机器(通过移动可执行 jar 和 lib/ 目录) .如果我尝试使用 jar-with-dependencies 或 shade 方法,我会遇到其他问题,所以我想让这个设置(maven-jar-plugin + maven-dependency-plugin)工作。
【问题讨论】:
-
物理文件是不是叫
snap-core-6.0.0-SNAPSHOT.jar?它与清单中的snap-core-6.0.0-20170810.175327-200.jar不同。 -
是的。我注意到了这种差异;我该如何解决?我猜最新快照的日期被添加到清单中 .jar 文件的名称中(代替 SNAPSHOT),但不在 lib/ 文件夹中。
-
好的,非常感谢@RomanPuchkovskiy 为我指明了正确的方向。我通过将此行添加到 maven-jar-plugin 中的清单、存档、配置来修复它:
<useUniqueVersions>false</useUniqueVersions>,如在 this post 中找到的@