java - ClassNotFoundException 尽管 list 类路径包含包含该类的 .jar

标签 java maven netbeans jar

我有一个 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/

相关文章:

javascript - 如何将输入标签更改为文本区域标签

java - Android Activity 在移除时监听 fragment

maven - Jenkins Tomcat 部署 : Context is defined in server. xml 并且可能无法取消部署

netbeans - 是否可以更改 netbeans 中的自动格式快捷方式?

java - 我无法运行 JAR 文件?

java - 在swing中使用getComponent()调用一个变量

java - spring jdbc 模板返回空结果

java - 什么是NullPointerException,我该如何解决?

Git for Windows(64 位)中的 Maven classworlds.launcher.Launcher 错误

maven - 尝试执行时出现 Oozie 错误 "bin/mkdistro.sh -DskipTests"