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

动态加载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

我需要动态加载jar并将其类提取到类路径,这样就不需要重新启动服务器。这是针对activi服务任务的,java类将作为jar提供。我尝试了下面的方法,但在部署服务任务时,它给出了错误“cannotinstantiatepackagename.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方法以外的自定义类加载器解决这个问题,你有什么想法吗

  • 您不能安全地假定系统类加载器是
    URLClassLoader
    的实例。通常是这样,但对于下一个版本的java来说可能不是这样
  • 无需编写自己的类加载器,
    URLClassLoader
    就可以了。当使用
    URLClassLoader(URL[]URL)
    构造函数实例化时,它将正确地委托给其父类加载器,因此您只需要自己的.jar文件的URL
  • 无需提取.class文件,
    ClassLoader
    知道如何从.jar文件加载类
  • 您可能希望将自定义类加载器设置为当前类加载器,即
    Thread.currentThread().setContextClassLoader(l)
  • 最后,您可以使用
    Class.forName(“my.foo.Class”)

嗨,陀螺仪,感谢您的回复。我试用了下面的代码片段。在Class.forName点调试时,类名可用。但在使用该类的确切位置,它给出了前面的错误,无法实例化。是否新类未包含在父类加载器中?`URLClassLoader=新的URLClassLoader(URL);Thread.currentThread().setContextClassLoader(加载器);Class.forName(className,true,loader).newInstance()`你找到合适的解决办法了吗?