Java 什么';导致NoSuchMethodError和NoClassDefFoundError的原因是什么?

Java 什么';导致NoSuchMethodError和NoClassDefFoundError的原因是什么?,java,classpath,noclassdeffounderror,nosuchmethoderror,Java,Classpath,Noclassdeffounderror,Nosuchmethoderror,运行test.class时,出现以下错误: Exception in thread "main" java.lang.NoSuchMethodError: ml.Temp.<init>(Ljava/lang/String;II)V at test.main(test.java:11) 实际上,我有一个包含Temp.class的jar文件(Temp是我编写的一个库文件,位于ml包下)。Temp有一个接受这三个参数的构造函数和一个公共函数 不确定这是否有帮助,但我在编译过程中包

运行test.class时,出现以下错误:

Exception in thread "main" java.lang.NoSuchMethodError: ml.Temp.<init>(Ljava/lang/String;II)V
    at test.main(test.java:11)
实际上,我有一个包含Temp.class的jar文件(Temp是我编写的一个库文件,位于ml包下)。Temp有一个接受这三个参数的构造函数和一个公共函数

不确定这是否有帮助,但我在编译过程中包含了jar文件的类路径。当我在test.class的运行过程中包含jar文件的类路径时,我得到以下结果

Exception in thread "main" java.lang.NoClassDefFoundError: test
Caused by: java.lang.ClassNotFoundException: test
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: test. Program will exit.
编辑:

如果有帮助,我编译如下(ml.jar和test.java在同一个目录中)


您应该从
test.class
所在的路径运行命令
java-cp test

编辑

NoSuchMethodError
表示在类
test
的第11行中,您试图使用
ml.ID3
(不是
Temp
!)的构造函数,其签名(
String,int,int
)不存在。这并不意味着它不在类路径中,因为这将导致
NoClassDefFoundError

另一方面,
NoClassDefFoundError:test
意味着
test
不再位于clsspath中。将jar添加到类路径中,如果这是您为获得
NoClassDefFoundError:test
所做的全部工作,无法导致
test
从类路径中消失。。。所以你更有可能做了其他一些不经意的行为

编辑2


可能该构造函数存在于开发环境中使用的
ID3
中,但它显然不存在于运行时环境中。如果它是第三方jat,可能会出现这种情况,您有两个jar版本,一个用于开发,另一个用于运行时。或者两者都出现在您的运行时环境中,但缺少构造函数工具优先级的环境。

您应该从
test.class
所在的路径运行命令
java-cp test

编辑

NoSuchMethodError
表示在类
test
的第11行中,您试图使用
ml.ID3
(不是
Temp
!)的构造函数,其签名(
String,int,int
)不存在。这并不意味着它不在类路径中,因为这将导致
NoClassDefFoundError

另一方面,
NoClassDefFoundError:test
意味着
test
不再位于clsspath中。将jar添加到类路径中,如果这是您为获得
NoClassDefFoundError:test
所做的全部工作,无法导致
test
从类路径中消失。。。所以你更有可能做了其他一些不经意的行为

编辑2


可能该构造函数存在于开发环境中使用的
ID3
中,但它显然不存在于运行时环境中。如果它是第三方jat,可能会出现这种情况,您有两个jar版本,一个用于开发,另一个用于运行时。或者两者都出现在您的运行时环境中,但缺少构造函数工具优先级。

如果没有源代码,很难准确地告诉您发生了什么,但看起来您的库和使用它的项目不同步。您是否更改了库/项目中任何方法的签名?我建议重新编译所有内容,然后检查类
test
是否使用了您重新编译的库的最新版本,以及其声明的
public


有关如何阅读
NoSuchMethodError
等的更多有用信息,请参阅此处的一篇优秀文章:

如果没有源代码,很难准确地告诉您发生了什么,但看起来您的库和使用它的项目不同步。您是否更改了库/项目中任何方法的签名?我建议重新编译所有内容,然后检查类
test
是否使用了您重新编译的库的最新版本,以及其声明的
public


有关如何阅读
NoSuchMethodError
等的更多有用信息,请参阅此处的一篇优秀文章:

我将假装成你,并完成整个过程:

1-图书馆。我在一个名为
workspace
的目录中。在它里面,我创建了一个名为
ml
的目录
ml
目录中,我创建了一个名为
Temp.java
的新文件,为了举例说明,该文件包含以下内容:

package ml;

public class Temp
{
    public Temp(String filename, int arg1, int arg2)
    {
        //do something
    }

    public void someFunction()
    {
        //do something else
        System.out.println("look left!");
    }
}
import java.io.*;
import ml.*;

public class Test
{
    public static void main(String[] args) throws FileNotFoundException, IOException
    {
        String filename = "input";

        Temp id = new Temp(filename, 6, 100);
        id.someFunction();
    }
}
我现在要编译library类并创建一个library jar。 首先,我通过运行

javac ./Temp.java
ml
目录中。然后,我将一个目录转到
工作区
目录并运行以下命令,从而对库进行jar:

jar cf ml.jar ml/
2-节目。现在,我在
workspace
目录中创建
Test.java
文件。该文件包含以下内容:

package ml;

public class Temp
{
    public Temp(String filename, int arg1, int arg2)
    {
        //do something
    }

    public void someFunction()
    {
        //do something else
        System.out.println("look left!");
    }
}
import java.io.*;
import ml.*;

public class Test
{
    public static void main(String[] args) throws FileNotFoundException, IOException
    {
        String filename = "input";

        Temp id = new Temp(filename, 6, 100);
        id.someFunction();
    }
}
3-结果。我现在开始编译并运行我的测试程序。在我运行的
工作区
目录中:

javac -cp ./:ml.jar ./Test.java
通过在
工作区
目录中运行以下命令,我最终可以运行该程序:

java -cp ./:ml.jar Test
这将显示输出:

look left!

我希望这能有所帮助。

我将假装成你,并经历整个过程:

1-图书馆。我在一个名为
workspace
的目录中。在它里面,我创建了一个名为
ml
的目录
ml
目录中,我创建了一个名为
Temp.java
的新文件,为了举例说明,该文件包含以下内容:

package ml;

public class Temp
{
    public Temp(String filename, int arg1, int arg2)
    {
        //do something
    }

    public void someFunction()
    {
        //do something else
        System.out.println("look left!");
    }
}
import java.io.*;
import ml.*;

public class Test
{
    public static void main(String[] args) throws FileNotFoundException, IOException
    {
        String filename = "input";

        Temp id = new Temp(filename, 6, 100);
        id.someFunction();
    }
}
我现在要编译library类并创建一个library jar。 首先,我通过运行

javac ./Temp.java
ml
目录中。然后,我通过一个方向对库进行jar