Java 什么';导致NoSuchMethodError和NoClassDefFoundError的原因是什么?
运行test.class时,出现以下错误: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有一个接受这三个参数的构造函数和一个公共函数 不确定这是否有帮助,但我在编译过程中包
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