Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.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 使用ClassLoader加载JAR文件时发生ClassNotFoundException_Java_Eclipse_Jar_Classloader - Fatal编程技术网

Java 使用ClassLoader加载JAR文件时发生ClassNotFoundException

Java 使用ClassLoader加载JAR文件时发生ClassNotFoundException,java,eclipse,jar,classloader,Java,Eclipse,Jar,Classloader,我从jar文件中获取了关于创建和使用类的指导(和代码) 我创建了一个Test.java文件: package a; public class Test { public String print(){ return "TestLALALA"; } } 并使用以下内容创建了一个jar文件: jar cvf0 Test.jar Test.java 当我(通过命令行)提取jar时,类是完整的 我将jar放在Eclipse项目的“libs”文件夹中。我可以在“库

我从jar文件中获取了关于创建和使用类的指导(和代码)

我创建了一个Test.java文件:

package a;
public class Test {
    public String print(){
        return "TestLALALA";
    }   
}
并使用以下内容创建了一个jar文件:

jar cvf0 Test.jar Test.java
当我(通过命令行)提取jar时,类是完整的

我将jar放在Eclipse项目的“libs”文件夹中。我可以在“库”下的“构建路径”项目中看到它

以下代码命中ClassNotFoundException:

URL[] urls = new URL[1];
try {
    File file = new File("C:\\Eclipse\\Demo\\libs\\Test.jar");
    urls[0] = file.toURI().toURL();
} catch (MalformedURLException e1) {
    e1.printStackTrace();
}
URLClassLoader loader = new URLClassLoader (urls);
Class classToLoad = null;
if(loader!=null)
{
    try {
        classToLoad = loader.loadClass("a.Test");
    } catch (ClassNotFoundException e1) {
        e1.printStackTrace();
    }
}
我错过了什么


谢谢大家!

看起来您只是将未编译的.java文件添加到JAR中,而不是将已编译的.class文件添加到JAR中


JAR中的文件应该是
a/Test.class
,因此您需要确保
a
目录存在于其中以表示包路径。目前,该文件似乎存在于JAR的根目录中,而不是子目录中。

使用Eclipse中的JAR导出来确保正确创建该文件

你可以试试这个:

Test test1 = new Test();
Class.forName("a.Test");
您可以删除测试1。。。如果要测试动态加载。
但是,我真的不明白为什么要使用UrlClassLoader使它变得如此复杂。

我添加了一条注释,说明了JAR中也需要存在包路径的目录。是的,谢谢。我是从“a”包文件夹中的批处理文件运行它的。看起来还可以,因为它现在正在工作(不是代码,而是jar被识别为一个库,可以直接调用测试类)!非常感谢。