Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ClassNotFoundException,尽管清单类路径包含包含该类的.jar_Java_Maven_Netbeans_Jar - Fatal编程技术网

Java ClassNotFoundException,尽管清单类路径包含包含该类的.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

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