繁体   English   中英

为activiti服务任务动态加载java类

[英]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。
  • 无需提取 .class 文件, ClassLoader知道如何从 .jar 文件加载类
  • 您可能希望将自定义类加载器设置为当前类加载器 - 沿着Thread.currentThread().setContextClassLoader(l)
  • 最终,您可以使用Class.forName("my.foo.class")加载您的类

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM