[英]Dynamic loading of java class for activiti Service Task
我需要动态加载一个 jar 并将其类提取到类路径,这样就不需要重新启动服务器。 这是用于 activi 服务任务,其中 java 类将作为 jar 提供。 我尝试了类似下面的内容,但是在部署服务任务时,它给出了错误“无法实例化 packageName.className。”我猜这意味着找不到该类。
URLClassLoader loader = (URLClassLoader)ClassLoader.getSystemClassLoader();
log.info("LOADER" +loader.getURLs());
MyClassLoader l = new MyClassLoader(loader.getURLs());
l.addURL(new URL("jar","","file:"+artifactLocation+"!/"));
JarFile jarFile = new JarFile(artifactLocation);
Enumeration e = jarFile.entries();
while (e.hasMoreElements()) {
JarEntry je = (JarEntry) e.nextElement();
if (je.isDirectory() || !je.getName().endsWith(".class")) {
continue;
}
// -6 because of .class
String className = je.getName().substring(0, je.getName().length() - 6);
className = className.replace('/', '.');
Class c = l.loadClass(className);
关于如何使用 OSGI 方法以外的自定义 classLoader 解决此问题的任何想法?
URLClassLoader
的实例。 通常是这样,但对于下一版本的 java 来说可能不是这样。URLClassLoader
就可以了。 当使用URLClassLoader(URL[] urls)
构造函数实例化时,它将正确地委托给其父类加载器,因此您只需要自己的 .jar 文件的 URL。ClassLoader
知道如何从 .jar 文件加载类Thread.currentThread().setContextClassLoader(l)
Class.forName("my.foo.class")
加载您的类
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.