簡體   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