2014-10-01 22 views
4

所以,我想在這裏做一些醜陋的事情,讓我們說這是一種絕望的措施,因爲我無法控制運行時環境。所以說,我在一個我無法控制classpath(壞事)的環境中運行一些代碼......還有更糟糕的是classpath有兩個jar,比如說productV1.jar和productV2。 jar兩者完全一樣,但版本不同,所以它們具有相同的類。通過類加載器忽略JARS醜陋的方式

出於某種原因,在大多數環境中,productV2.jar被加載,而productV1.jar被省略,但在其他一些環境中,productV1.jar被調用,並導致程序崩潰。

我想做的解決方法是與類加載器混淆在一起,顯式忽略「productV1.jar」。理想情況下,通過覆蓋一些類加載函數。我使用其他資源(如Hibernate的persistence.xml文件)完成了此操作,但我不想基於包含類進行過濾,而是基於jar文件進行過濾。有沒有辦法?

這只是爲了工作,直到我能做到的談判擺脫違規罐子......

編輯:我將離開這個問題的情況下,開有一些有趣的黑客。然而,問題在於classpth中的所有內容都是由系統類加載器加載的,並且試圖在運行時切換它並不是一件容易的事情(或者根本不可能?)。我看到的唯一方法是使用自定義類加載器啓動該過程,這不是我正在尋找的過程。

+0

我認爲應該避免做這樣的事情,即使有很好的理由,但從「理論上有可能是什麼」的角度來看問題是有趣的。 – mschenk74 2014-10-02 07:33:30

+1

你真正的問題不是技術問題,而是你的環境。你不能和任何控制設置類路徑來解決問題的人交談嗎?像這樣的解決方法只會讓問題變得更糟。 – SteveD 2014-10-02 08:16:04

+0

事實上,我正在照顧環境,但由於需要時間,我認爲找到一個短期的黑客會很有趣...但是我發現它不會很容易... – Martin 2014-10-02 08:45:04

回答

1

您是否嘗試使用URLClassLoader並手動將jar添加到類路徑中?在URLClassLoader的構造函數中,您傳遞一組指向要加載的JAR的URL。

您可以進行如下實驗:創建一個URLClassLoader的子類,只包含所需的罐子(即調用帶有URL的適當陣列超級構造函數),然後調用你的java具有以下特性:

-Djava.system.class.loader=test.CustomJarsClassloader

將您的類加載器設置爲默認類。

的類加載器可能看起來像:

public class CustomJarsClassLoader extends URLClassLoader{ 
    public CustomJarsClassLoader(){ 
    super(new URL[]{ /*List of URLs to jars... */}); 
    } 
} 

UPDATE:

好吧,如果你不能添加此參數命令行,然後嘗試另一種方法:

  1. 在你main()函數創建一個新線程
  2. 將我上面提到的類加載器設置爲此線程的上下文類加載器(s ee:javadocs
  3. 在本主題中運行所有應用程序的代碼。你的類加載器應該用來加載類。
+0

如果他不能改變類路徑,他可以添加任何額外的參數來調用java運行時的機會是什麼? – SteveD 2014-10-02 08:18:07

+0

確實......我希望能夠在運行時做些事情。這是一個黑客的希望,但我甚至嘗試改變使用反射(工作)的系統類加載器的類路徑,但它似乎加載類的方式,然後我可以把它弄糟...... :) – Martin 2014-10-02 08:27:43

+0

@Martin好的,我用另一種方法更新了我的帖子。也許這會有所幫助? – 2014-10-02 08:59:47