使用User URLClassLoader在运行时加载jar文件 "on the fly"

9 浏览
0 Comments

使用User URLClassLoader在运行时加载jar文件 "on the fly"

基本上,我尝试使用这里描述的方法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具体做什么)。

0
0 Comments

问题:使用URLClassLoader动态加载jar文件的原因和解决方法。

使用URLClassLoader动态加载jar文件时,出现了以下问题:在使用URL来加载jar文件时,URL的格式必须是"jar:file..."这样的形式,但是这种URL的格式不符合常规的URL格式,不太容易理解和使用。

解决方法如下:

1. 首先,需要确定要加载的jar文件的路径。可以使用File类的exists()方法来检查文件是否存在。

2. 创建一个URL对象,将jar文件的路径转换为URL格式。可以使用File类的toURI()方法将文件路径转换为URI,再使用URI的toURL()方法将URI转换为URL。

3. 创建一个URL数组,将刚刚创建的URL对象放入数组中。

4. 使用URLClassLoader类的构造方法,传入URL数组作为参数,创建一个URLClassLoader对象。

5. 使用Class类的forName()方法,传入要加载的类的全限定名、是否初始化以及要使用的ClassLoader对象,返回一个Class对象。

6. 使用Class对象的getDeclaredMethod()方法,传入要调用的方法的名称,返回一个Method对象。

7. 使用Method对象的invoke()方法,传入要调用方法的对象,返回一个Object对象,即方法的返回值。

通过以上步骤,可以使用URLClassLoader动态加载jar文件,并调用jar文件中的类的方法。

以上就是使用URLClassLoader动态加载jar文件的原因和解决方法。

0