【问题标题】:ClassNotFoundException when loading JAR file with ClassLoader使用 ClassLoader 加载 JAR 文件时出现 ClassNotFoundException
【发布时间】:2013-04-15 18:12:28
【问题描述】:

我在这里和那里收集了有关从 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 eclipse jar classloader


    【解决方案1】:

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

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

    【讨论】:

    • 我添加了一条注释,说明 JAR 中也需要存在包路径的目录。
    • 好的,谢谢。我从位于“a”包文件夹中的批处理文件运行它。似乎没问题,因为它现在可以工作了(仍然没有代码,但是 jar 被识别为库并且可以直接调用 Test 类)!谢谢!
    【解决方案2】:

    使用 Eclipse 中的 jar 导出来确保它被正确创建。

    你可以试试这个:

    Test test1 = new Test();
    Class.forName("a.Test");
    

    如果你想测试动态加载,你可以删除 Test test1 ...。 但是我真的不明白你为什么用 UrlClassLoader 让它变得如此复杂。

    【讨论】:

      猜你喜欢
      • 2019-09-08
      • 2015-10-04
      • 1970-01-01
      • 2019-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      相关资源
      最近更新 更多