用户URLClassLoader可以“动态”加载jar文件

时间:2018-09-03 08:04:10

标签: java urlclassloader

好吧,基本上,我尝试使用此处介绍的方法JarFileLoader来加载一个包含一个类的jar,该类的使用方式将与在类路径上使用的方式相同(类名将是动态的,因此我们可以只添加具有任何类的任何jar,程序将通过在主行中解析文本文件来加载它。

问题是当我调试并检查URLClassLoader对象时

protected Class<?> findClass(final String name)

行:

Resource res = ucp.getResource(path, false);

getResource()在参数中找不到类名称。

有人已经尝试过以这种方式加载jar文件吗?

谢谢。

加载程序:

public class JarFileLoader extends URLClassLoader {
    public JarFileLoader() {
        super(new URL[] {});
    }

    public JarFileLoader withFile(String jarFile) {
        return withFile(new File(jarFile));
    }

    public JarFileLoader withFile(File jarFile) {
        try {
            if (jarFile.exists())
                addURL(new URL("file://" + jarFile.getAbsolutePath() + "!/"));
        } catch (MalformedURLException e) {
            throw new IllegalArgumentException(e);
        }
        return this;
    }

    public JarFileLoader withLibDir(String path) {
        Stream.of(new File(path).listFiles(f -> f.getName().endsWith(".jar"))).forEach(this::withFile);
        return this;
    }
}

主要:

public static void main(String[] args) {
    new Initializer();
    JarFileLoader cl = new JarFileLoader();
    cl = cl.withFile(new File("libs/dpr-common.jar"));
    try {
        cl.loadClass("com.*****.atm.dpr.common.util.DPRConfigurationLoader");
        System.out.println("Success!");
    } catch (ClassNotFoundException e) {
        System.out.println("Failed.");
        e.printStackTrace();
    } finally {
        try {
            cl.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这是我使用的测试课程。当我调试URLClassLoader时,我可以在第三个循环中看到jar文件的路径(类路径和您在此处添加的URL上的循环),但是仍然找不到资源(并且无法调试类URLClassPath,所以不知道getRessource做什么)恰好)。

1 个答案:

答案 0 :(得分:0)

好吧,我从这个问题中得到答案:How to load all the jars from a directory dynamically?

并从一开始就更改URL的一部分,直到完成大部分工作为止。

所以一个例子可能是:

String path = "libs/dpr-common.jar";
if (new File(path).exists()) {
    URL myJarFile = new File(path).toURI().toURL();
    URL[] urls = { myJarFile };
    URLClassLoader child = new URLClassLoader(urls);
    Class DPRConfLoad = Class.forName("com.thales.atm.dpr.common.util.DPRConfigurationLoader", true, child);
    Method method = DPRConfLoad.getDeclaredMethod("getInstance");
    final Object dprConf = method.invoke(DPRConfLoad);
}

我的所有时间都花在搜索上,而这是一个错误的示例...仍然不明白为什么他们使用愚蠢的URL,例如“ jar:file ...”等。

谢谢大家。