簡體   English   中英

從依賴於另一個jar的jar加載類

[英]Load a class from a jar having dependency on another jar

我的項目結構如下(當然非常簡化): 項目結構

因此,在lib-ext我每天都要從Jenkins服務器上下載2個jar文件“ jar1和jar2”,以供我的程序檢查,我需要一個來自“ jar1”的文件稱為“ Class2Bloaded”。 問題在於該文件實現了在“ jar2”中可以找到的接口,我們稱其為“ Dependency”

我想做的是,從我的類在src“ ClassThatLoads.java”下,加載'Class2Bloaded.class'並告訴類加載器查看'jar2'以搜索實現接口“ Dependency.class”

到目前為止,我的代碼(省略了異常處理):

    //Create the URL pointing to Jar1
  private URL getJarUrl(JarFile jarFile)
  {
      return new File(jarFile.getName()).toURI().toURL();
  }

  URL jar1Url = getJarUrl(jar1);
  ClassLoader jar1classLoader = new URLClassLoader(new URL[] { jar1Url });
  Class<?> Class2Bloaded = Class.forName(fullClassName, false, jar1classLoader );

因此問題發生在Class.forName調用內,因為我要加載的類實現了jar 2中的接口。

Exception in thread "main" java.lang.NoClassDefFoundError: com/packagewithinJar2/Dependency

因此,最終我准備了另一個指向“ jar2”的類加載器,甚至獲得了所需的實際接口:

URL jar2Url = getJarUrl(jar2);
  ClassLoader jar2classLoader = new URLClassLoader(new URL[] { jar2Url });
  Class<?> Interface2Bloaded = Class.forName(fullClassName, false, jar2classLoader );

在第二種情況下,“ fullClassName”是“ Class2Bloaded”所依賴的接口的標准名稱。 只是我在ClassLoader的javadocs中找不到任何東西,允許我為依賴項“注入”其他類加載器。 希望我的解釋清楚。

首先要做的是將jar2添加到URLClassLoader讀取的jar列表中:

ClassLoader jarclassLoader = new URLClassLoader(new URL[] { jar1Url, jar2Url });

但是通常要做的是從一開始就在您的類路徑上添加jar1和jar2。

為此,您將使用java可執行文件的-cp參數。

例如,如果將類編譯到bin目錄中:

java -cp libext/jar1.jar:libext/jar2.jar:bin ClassThatLoads

這樣,您可以在自己的Java源代碼中使用無縫的類,並擺脫麻煩的加載部分:

public class ClassThatLoads {
  public static void main(String[] args) {
    Class2Bloaded stuff = new Class2Bloaded();
    //use stuff from here...
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM