我正在寫一個插件加載我的代碼作爲子類加載器的框架我自己的Xalan實現加載其中一個較舊的Xalan被加載到父類加載器
的問題是,該框架使用某個版本的Xerces ,這與我的代碼不兼容,我想使用我自己的jar包作爲xerces,但似乎是因爲舊的jar已經加載了,我似乎無法讓我的代碼使用我的代碼。
我在尋找一些類加載器的分離 - ,我知道這是一個已知的問題,但似乎無法來解決它
是否有任何框架,庫或代碼樣本用戶在本地在這樣一個新的罐子一個場景?
我正在寫一個插件加載我的代碼作爲子類加載器的框架我自己的Xalan實現加載其中一個較舊的Xalan被加載到父類加載器
的問題是,該框架使用某個版本的Xerces ,這與我的代碼不兼容,我想使用我自己的jar包作爲xerces,但似乎是因爲舊的jar已經加載了,我似乎無法讓我的代碼使用我的代碼。
我在尋找一些類加載器的分離 - ,我知道這是一個已知的問題,但似乎無法來解決它
是否有任何框架,庫或代碼樣本用戶在本地在這樣一個新的罐子一個場景?
您是否嘗試通過將它們放置在對應java.ext.dirs系統屬性路徑加載你的框架和Xerces庫作爲中的ExtClassLoader一部分的班?這樣,框架的Xerces實現版本將由ExtClassLoader加載。
然後,您可以將您的Xerces實現版本放置在與AppClassLoader加載的java.class.path系統屬性相對應的路徑中。
我還沒有嘗試過這個,但考慮到類加載層次結構這應該工作。你可以在這裏瞭解更多關於類加載層次的信息 - http://onjava.com/pub/a/onjava/2005/01/26/classloading.html
嘗試做:
ClassLoader oldContextClassLoader = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(childClassLoader);
try{
// do xml parsing
}finally{
Thread.currentThread().setContextClassLoader(oldContextClassLoader);
}
謝謝,我假設childClassLoader可以通過對它加載的類執行此操作來實現:getClass()。getClassLoader(),對不對?會嘗試寫回... – 2011-03-26 13:44:39
我試過上面,它似乎沒有工作 – 2011-03-26 17:52:19
查看我的相關問題http://stackoverflow.com/questions/5447633/how-to-prevent-xalan-jar-that-has-meta-inf-services -javax-xml-transform-transform – 2011-03-27 06:36:19