簡體   English   中英

是否可以在Java中加載相同DLL的不同版本?

[英]Is it possible to load different versions of the same DLL in Java?

我有一個與一組第三方庫交互的JNI庫,系統上可能有多個版本的第三方庫。 對於第三方庫的每個版本,出於可比性原因,我必須重新編譯JNI代碼。 現在我通過加載具有特定名稱的DLL來解決這個問題,如果版本發生更改,我會更改JNI接口DLL的名稱,以便正確的版本具有正確的加載名稱。

我希望能夠根據用戶想要使用的版本動態加載dll。 如果我在具有不同名稱但具有相同方法簽名的DLL上調用System.loadLibrary兩次會發生什么?

System.loadLibrary("JNIv1");
// Same code compiled against a different third party version
System.loadLibrary("JNIv2");

我只需要一次使用其中一個版本,所以如果舊版本不再可訪問就沒問題。

是否可以使用相同的方法簽名加載兩個不同版本的DLL而無需重新啟動程序?

這是可能的,事實上它是完全支持和卓越的工作。

我不得不在生產環境和太陽JVM上做到這一點,它堅如磐石。

基本上,如果從其他類加載器加載庫,則它將加載庫的不同副本。 就這么簡單。

我不建議這樣做,除非你真的必須...但它確實有效。

作為替代方案,根據您的具體要求,您可以將其從流程中刪除,並在客戶端和不同服務器之間使用簡單的協議(使用say jetty / xstream / httpclient或netty),每個服務器都有不同的加載DLL版本。

從本質上講,這涉及到編寫類加載器

public class MyClassLoader extends URLClassLoader {

   protected String findLibrary(String libName) {
         if ( libName.equals("mylib.dll")) {
              return "full/path/to/library";
         }
         else {
              super.findLibrary(libName);
         }
   }
}

然后你安排使用相關的類加載器加載你的類的實現...

public interface Implementation {

}

public class ImplementationLookerUpper {

    Classloader v1 = new MyClassloader(version1);
    Classloader v2 = new MyClassloader(version2);


    public Implementation implementationUsingVersion(Version someversion) {

             Classloader classloader = pickCorrectClassLoaderForVersion(someVersion);

            return (Implementation) classloader.loadClass(RealImplementation.class.getName()).newInstance();

    }
}

那種事.....

我不知道windows中DLL加載的工作原理,但我的直覺告訴我,同時加載重疊庫肯定是不安全的。 但也許如果你第一次卸載第一個,它可能是。

據我所知,沒有辦法顯式卸載庫。 如果你看一下java.lang.Classloader.NativeLibrary,你會看到當導致它被加載的類加載器被垃圾收集時(在其finalize()方法中)卸載了一個庫。 因此,如果你將它加載到一個單獨的類加載器中,然后等待它被垃圾收集(帶有一些邪惡的調用System.gc()以使這種情況發生得更快),然后再加載新的類加載器,這可能會有所幫助。

這不安全,實施起來很麻煩。 對於不同版本的dll,可以有不同的類加載器。 您必須確保對類加載器進行垃圾回收以確保已卸載dll。 (參見Java JNI - DLL卸載

在過去,我們通過編寫一個輕量級的java mediator進程來解決這個問題,該進程處理用戶的請求並使用所請求的dll版本創建一個新的子java進程。 當用戶請求不同的版本時,介體會關閉現有的子級並生成具有不同庫路徑的新子級。 這種方法效果很好。 唯一的缺點是啟動新JVM所需的時間,但只有當您經常有很多版本交換機請求時才會注意到這一點。

暫無
暫無

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

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