2011-06-13 70 views
0

不同的路徑在我的圖書館之一(比如abc.jar),我有一個類MyClass.class。由於我需要在運行時瞭解哪個目錄中存在abc.jar文件,因此使用了以下邏輯。MyClass.class.getResource( 「MyClass.class」)。的getPath()返回到JBoss 4.2.3和JBoss 5.1.0

String classPath = MyClass.class.getResource("MyClass.class").getPath(); 

在JBoss中4.2.3,這將導致在CLASSPATH等於這樣的事情:

file:/D:/app-servers/jboss-4.2.3.GA/server/uat012/deploy/MyApp.war/WEB- 
INF/lib/abc.jar!/com/foo/bar/MyClass.class 

而在JBoss的5.1.0,類路徑返回

/D:/app-servers/jboss-5.1.0.GA/server/uat012/deploy/MyApp.war/WEB- 
INF/lib/abc.jar/com/foo/bar/MyClass.class 

不同的是,它不是以'文件'和'!'開始的在罐子裏拆分罐子位置和類位置的字符也是缺失的。

那麼,是不是因爲JBoss 5.1.0中類加載的方式不同?

什麼是從給定的類文件中識別jar的位置的最佳方式,而不依賴於web/app服務器和正常的JVM

回答

1

簡短的回答是,做你想做的事是不安全的,因爲不能保證你試圖找到的jar文件存在。如果該罐子已經擴大會怎麼樣?如果應用服務器使用其他形式的存儲(即在數據庫中)會怎麼樣? jar的位置是一個對應用程序來說不應該很重要的實現細節。也就是說,如果你必須這樣做(表明設計不好),你必須在每個目標平臺上嘗試它並編寫特定於平臺的代碼,每次升級到最新版本。

+0

非常感謝Jim先生。我理解這一點,不幸的是,這是我遺留下來的一部分遺留代碼,並且儘量不要改變太多。顯然現在,這是需要重新寫入一個標準的方式。 – ssethupathi 2011-06-13 15:27:27