使用User URLClassLoader在运行时加载jar文件 "on the fly"
使用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具体做什么)。
问题:使用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文件的原因和解决方法。