1

我试图用 classLoader 从 jar 文件中加载一个类。这是我的代码:

private void loadJar(String path, String className) {

    try {

        File file = new File(path);

        if (!(file.exists())) {
            log.error("JAR File not found!");
            return;
        }

        String anUrl = "jar:file://" + file.getAbsolutePath() + "!/";
        URL[] urls = { new URL(anUrl)};
        URLClassLoader classLoader = new URLClassLoader(urls);

        System.out.println("className: "+className);
        Class aClass = classLoader.loadClass(className);

        if (!(isNullaryConstructor(aClass))) {
            System.out.println("Non nullary Constructor detected!");
            return;
        }

        Object anInstantiation = aClass.newInstance();

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } 
}

我在带有主类的测试工作区中尝试了它。它有效。

但是,当我将它集成到我的项目中时。我得到了这个错误:

java.lang.ClassNotFoundException

我正在使用 Maven。我必须在依赖项中添加一些东西吗?

我列出了 jar 文件中存在的类,以使用以下代码验证 className 是否正确:

public static void main(String[] args) throws Exception {

    JarFile jf = new JarFile(new File(jarPath));

    Enumeration<JarEntry> e = jf.entries();
    while (e.hasMoreElements()) {
                    JarEntry entry = e.nextElement();
        System.out.println(entry.toString());
    }
    jf.close();
}

而且我输入的名字是正确的。

任何帮助,请!

谢谢 :)

4

1 回答 1

0
  1. URL 可能是错误的。试试file.toURI().toURL()吧。或删除!/; 标准的 Java 类加载器不支持这种语法。

  2. 类的名称可能是错误的。确保您使用完全限定的名称(即带有包名称)、元素分隔.且没有.class扩展名。对于String,你会使用java.lang.String

于 2012-09-12T11:43:18.037 回答