2011-10-16 85 views
1

有沒有辦法使用來自Tomcat應用程序的getResourceAsStream加載存儲在JAR中的文件?使用getResourceAsStream將文件加載到Tomcat的JAR中

我有一個庫,它將所需的所有文件放入它的jar文件中,以及編譯好的類。此代碼在獨立應用程序中使用庫時起作用,但在Tomcat內部使用庫時(使用PHP java橋)則不起作用。

final InputStream stream = Object.class.getResourceAsStream("/styles/foo.xsl"); 

我試圖沒有成功使用問題getResourceAsStream not loading resource in webapp列出的解決方案,改變了代碼

final ClassLoader resourceLoader = Thread.currentThread().getContextClassLoader(); 
final InputStream stream = resourceLoader.getResourceAsStream("/styles/foo.xsl"); 

當庫用於獨立或何時出庫後的代碼不工作也不在Tomcat中使用。在這兩種情況下stream == null

我想加載的文件正確存儲在JAR中的/styles/foo.xsl。帶有所有類和這些其他文件的JAR是tomcat/webapps/iJavaBridge/WEB-INF/lib/

有人可以推薦一段代碼,可以在Tomcat和非Tomcat應用程序中使用嗎?

+0

http://www.sitepoint.com/forums/showthread.php?320858-tomcat-classloader-problem建議使用'<上下文路徑= 「/應用」 antiJARLocking = 「真」/>'。我應該向Tomcat管理員建議這個更改嗎? – gioele

回答

5

您需要從路徑中刪除前導斜槓。這隻適用於不在classpath根目錄下運行的類加載器。

final ClassLoader resourceLoader = Thread.currentThread().getContextClassLoader(); 
final InputStream stream = resourceLoader.getResourceAsStream("styles/foo.xsl"); 
+0

謝謝,這工作得很好。您能否詳細說一下「對類路徑根目錄沒有操作的類加載器」是什麼意思? – gioele

+0

您從某個類獲得的類加載器(如您最初所做的那樣)相對於* that *類的位置進行操作,並且可以採用相對路徑或以/開頭的路徑。 – BalusC

0

如果您在xsl的jar包中有類文件,請嘗試以下操作: final ClassLoader resourceLoader = com.mypackage.MyClassInJar.class.getClassloader(); final InputStream stream = resourceLoader.getResourceAsStream(「/ styles/foo.xsl」);

如果沒有類,只需創建一個虛擬類。

我認爲這應該工作,因爲你總是會得到負責jar的類加載器。

相關問題