我有一个 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-dependency 或 shade 方法,我会遇到其他问题,所以我想让这个设置(maven-jar-plugin + maven-dependency-plugin)正常工作。
最佳答案
好吧,问题(正如 Roman Pushkovskiy 所正确指出的)是 list 文件中的 jar 文件的名称与 lib 目录中的名称不同。这些依赖项大多是快照,因此 jar 的名称类似于 dependency-1.0.0-SNAPSHOT.jar。在 list 中,它们将根据快照的日期被赋予一个唯一的名称:lib/dependency-1.0.0-20170810.175327-200.jar。解决方案是将这一行添加到 maven-jar-plugin 中:<useUniqueVersions>false</useUniqueVersions>
。
更新了 pom.xml 摘录:
(...)
<build>
<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>
<useUniqueVersions>false</useUniqueVersions>
</manifest>
</archive>
</configuration>
</plugin>
(... other plugins ...)
</build>
(...)
希望这可以帮助其他人!
关于java - ClassNotFoundException 尽管 list 类路径包含包含该类的 .jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45642451/