动态加载activiti服务任务的java类
我需要动态加载jar并将其类提取到类路径,这样就不需要重新启动服务器。这是针对activi服务任务的,java类将作为jar提供。我尝试了下面的方法,但在部署服务任务时,它给出了错误“cannotinstantiatepackagename.className”。我想这意味着找不到该类动态加载activiti服务任务的java类,java,dynamic,classloader,loading,Java,Dynamic,Classloader,Loading,我需要动态加载jar并将其类提取到类路径,这样就不需要重新启动服务器。这是针对activi服务任务的,java类将作为jar提供。我尝试了下面的方法,但在部署服务任务时,它给出了错误“cannotinstantiatepackagename.className”。我想这意味着找不到该类 URLClassLoader loader = (URLClassLoader)ClassLoader.getSystemClassLoader(); log.info("LOADER" +loa
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方法以外的自定义类加载器解决这个问题,你有什么想法吗 - 您不能安全地假定系统类加载器是
的实例。通常是这样,但对于下一个版本的java来说可能不是这样URLClassLoader
- 无需编写自己的类加载器,
就可以了。当使用URLClassLoader
构造函数实例化时,它将正确地委托给其父类加载器,因此您只需要自己的.jar文件的URLURLClassLoader(URL[]URL)
- 无需提取.class文件,
知道如何从.jar文件加载类ClassLoader
- 您可能希望将自定义类加载器设置为当前类加载器,即
Thread.currentThread().setContextClassLoader(l)
- 最后,您可以使用
Class.forName(“my.foo.Class”)