Java ClassNotFoundException,尽管清单类路径包含包含该类的.jar
我有一个maven java项目,我正试图从命令行运行它。该项目是使用Netbeans 8.1构建的。它构建为java-snap-2.0.jar,带有maven依赖插件和maven 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 ClassNotFoundException,尽管清单类路径包含包含该类的.jar,java,maven,netbeans,jar,Java,Maven,Netbeans,Jar,我有一个maven java项目,我正试图从命令行运行它。该项目是使用Netbeans 8.1构建的。它构建为java-snap-2.0.jar,带有maven依赖插件和maven jar插件 在我的根/目标目录中,我找到一个lib/目录,其中包含项目依赖项所需的所有.jar。例如,我有一个snap-core-6.0.0-SNAPSHOT.jar,其中包括org/esa/snap/core/datamodel/Product.class。在我的可执行jar中,我有一个META-INF/MANIF
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>
(...)
(…)
org.apache.maven.plugins
maven依赖插件
复制依赖项
包裹
复制依赖项
${project.build.directory}/lib/
假的
假的
真的
org.apache.maven.plugins
maven jar插件
2.4
真的
解放党/
com.batchprocessing.java.snap.Main
(…其他插件…)
(...)
我非常感谢你帮我弄明白这一点。通过从IDE运行这个应用程序,我已经使用了一年,但是我希望能够从命令行运行它,并将它移动到其他机器上(通过移动可执行jar和lib/目录)。如果我尝试使用带有依赖项或着色方法的jar,我会遇到其他问题,因此我希望这个设置(maven jar插件+maven依赖项插件)能够正常工作。好的,问题(正如Roman Pushkovskiy正确指出的)是清单文件中的jar文件的名称与lib目录中的名称不同。这些依赖关系大多是快照,因此jar的名称类似于dependency-1.0.0-SNAPSHOT.jar。在清单中,它们将根据快照的日期被赋予一个唯一的名称:lib/dependency-1.0.0-20170810.175327-200.jar。解决方案是将这一行添加到maven jar插件:false
更新的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>
(...)
(…)
org.apache.maven.plugins
maven jar插件
2.4
真的
解放党/
com.batchprocessing.java.snap.Main
假的
(…其他插件…)
(...)
希望这能帮助别人 好吧,问题是(正如Roman Pushkovskiy正确指出的那样)清单文件中jar文件的名称与lib目录中的名称不同。这些依赖关系大多是快照,因此jar的名称类似于dependency-1.0.0-SNAPSHOT.jar。在清单中,它们将根据快照的日期被赋予一个唯一的名称:lib/dependency-1.0.0-20170810.175327-200.jar。解决方案是将这一行添加到maven jar插件:false
更新的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>
(...)
(…)
org.apache.maven.plugins
maven jar插件
2.4
真的
解放党/
com.batchprocessing.java.snap.Main
假的
(…其他插件…)
(...)
希望这能帮助别人 物理文件名为
snap-core-6.0.0-SNAPSHOT.jar
?它与清单中的snap-core-6.0.0-20170810.175327-200.jar不同。是的。我注意到了这种差异;我怎样才能修好它?我猜最新快照的日期会被添加到清单中的.jar文件名中(代替快照),但不会添加到lib/文件夹中。好的,非常感谢@RomanPuchkovskiy为我指明了正确的方向。我通过在maven jar插件的清单、归档和配置中添加这一行来修复它:false
,在中可以找到名为snap-core-6.0.0-SNAPSHOT.jar的物理文件?它与清单中的snap-core-6.0.0-20170810.175327-200.jar不同。是的。我注意到了这种差异;我怎样才能修好它?我猜最新快照的日期会被添加到清单中的.jar文件名中(代替快照),但不会添加到lib/文件夹中。好的,非常感谢@RomanPuchkovskiy为我指明了正确的方向。我通过在maven jar插件的清单、存档和配置中添加这一行来修复它:false
如中所示。有人知道要在gradle中插入useUniqueVersions false吗?有人知道要在gradle中插入useUniqueVersions false吗?