好吧,基本上,我尝试使用此处介绍的方法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)
好吧,我从这个问题中得到答案: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 ...”等。
谢谢大家。