Java 又一个NoClassDefFoundError难题

Java 又一个NoClassDefFoundError难题,java,noclassdeffounderror,Java,Noclassdeffounderror,我创建了两个jar文件my.common.jar,其中包含助手类和方法(主要是静态方法)。我还创建了一个jar文件test.jar,其中包含一个main方法,该方法在my.common.jar的类中调用静态方法 当我像这样启动main时,一切正常: java -classpath path/to/myjars/my.common.jar:./test.jar test.Tester Tester是test.jar中包含main方法的类 但是当我以这种方式运行时,我得到了NoClassDefFo

我创建了两个jar文件my.common.jar,其中包含助手类和方法(主要是静态方法)。我还创建了一个jar文件test.jar,其中包含一个main方法,该方法在my.common.jar的类中调用静态方法

当我像这样启动main时,一切正常:

java -classpath path/to/myjars/my.common.jar:./test.jar test.Tester
Tester是test.jar中包含main方法的类

但是当我以这种方式运行时,我得到了
NoClassDefFoundError my/common/Myclass

java -classpath path/to/myjars/my.common.jar -jar test.jar
我尽了很大的努力,但我不知道为什么失败,也不知道如何解决这个问题。我非常感谢你的帮助

-----附录---- 我忘了提到test.jar中的清单文件如下所示:

    Manifest-Version: 1.0
    Build-Jdk: 1.6.0_13
    Created-By: Apache Maven
    Main-Class: test.Tester
    Archiver-Version: Plexus Archiver

在命令行上不能同时使用
-classpath
-jar
选项。使用一个或另一个。。。但不是两者都有

当您使用
-jar
选项时,该命令期望在jar文件清单中找到入口点类和运行时类路径。您的
-classpath
参数将被忽略,classpath环境变量也将被忽略。引自:

使用此选项时,JAR文件是所有用户类的源,其他用户类路径设置将被忽略

如果您的(可执行)JAR文件需要使用其他JAR中的内容,那么它需要清单中的
类路径
属性。该属性值是一个以空格分隔的URL列表;看

因此,在您的情况下,您需要在JAR的清单中添加如下内容:

Class-path: /path/to/myjars/my.common.jar

Java教程的第1部分介绍了这个主题,并包括一个警告,即必须用CR或NL正确终止
类路径
清单行,JVM才能识别它。

您不能在命令行上同时使用
-classpath
-jar
选项。使用一个或另一个。。。但不是两者都有

当您使用
-jar
选项时,该命令期望在jar文件清单中找到入口点类和运行时类路径。您的
-classpath
参数将被忽略,classpath环境变量也将被忽略。引自:

使用此选项时,JAR文件是所有用户类的源,其他用户类路径设置将被忽略

如果您的(可执行)JAR文件需要使用其他JAR中的内容,那么它需要清单中的
类路径
属性。该属性值是一个以空格分隔的URL列表;看

因此,在您的情况下,您需要在JAR的清单中添加如下内容:

Class-path: /path/to/myjars/my.common.jar

Java教程的第1部分介绍了这个主题,并包括一个警告,即必须用CR或NL正确终止
类路径
清单行,JVM才能识别它。

将清单放入test.jar。其他jar通常进入./lib目录。 要将META-INF/MANIFEST.MF添加到jar,通常可以使用构建基础设施:ant或maven。或者手动操作

您已经在主类test.Tester中使用了它。 现在类路径:


在Maven中,依赖项通常添加到pom.xml中的jar中。您可以使用mvn将自己的JAR放入存储库。然后在pom.xml中添加一个依赖项。

将清单放入test.jar。其他jar通常进入./lib目录。 要将META-INF/MANIFEST.MF添加到jar,通常可以使用构建基础设施:ant或maven。或者手动操作

您已经在主类test.Tester中使用了它。 现在类路径:


在Maven中,依赖项通常添加到pom.xml中的jar中。您可以使用mvn将自己的JAR放入存储库。然后在pom.xml中添加一个依赖项。

看起来您还没有在清单文件的test.jar中定义主类。第二个实现开始工作。您需要在jar的
MANIFEST.MF
中指定主类。看起来您还没有在MANIFEST文件的test.jar中定义主类。第二个实现才能工作。您需要在jarI的
MANIFEST.MF
中指定主类“export CLASSPATH=pth/to/myjars/my.common.jar”,以便在命令行中不使用-CLASSPATH。那也没用。另外,这对我来说是新的信息,我不能同时使用-classpath和-jar。谢谢Stephen。。。我将类路径添加到清单文件,现在它可以工作了。。。但我以前没必要这么做。我在Java1.4.2下运行这些程序,现在迁移到Java1.6。所以我想知道为什么它在旧版本下运行良好,而不是在新版本下@CJ-我无法解释这是为什么。也许有人在1.4.2 Java安装的extensions目录中植入了
my.common.jar
文件的副本。(Tsk,Tsk,Tsk)我有“export CLASSPATH=pth/to/myjars/my.common.jar”,这样就不会在命令行上有-CLASSPATH。那也没用。另外,这对我来说是新的信息,我不能同时使用-classpath和-jar。谢谢Stephen。。。我将类路径添加到清单文件,现在它可以工作了。。。但我以前没必要这么做。我在Java1.4.2下运行这些程序,现在迁移到Java1.6。所以我想知道为什么它在旧版本下运行良好,而不是在新版本下@CJ-我无法解释这是为什么。也许有人在1.4.2 Java安装的extensions目录中植入了
my.common.jar
文件的副本。(Tsk,Tsk,Tsk)