2013-10-21 79 views
1

我已經使用NetBeans 7.2.1編寫了一個java Servlet web應用程序。該程序有一些附加到項目的jar文件庫。使用NetBeansApache Tomcat 7.0.27可以正常運行應用程序。如何更改jar文件在java Web應用程序中使用的路徑

我的問題是,我在項目中使用的一些jar文件庫需要訪問一些文件夾和文件。我將這些文件夾和文件放在與整個NetBeans項目相同的目錄中。但我得到這個異常:

Exception: java.lang.RuntimeException: java.io.FileNotFoundException 

所以我用這些代碼,找出我應該把他們:

out.println("current directory: " + new File(".").getAbsolutePath()); 
out.println("current directory: " + System.getProperty("user.dir")); 
out.println("current directory: " + getServletContext().getRealPath(("/"))); 

所以我想通了,當前的工作目錄是:

Ç :\ Program Files \ Apache Software Foundation \ Apache Tomcat 7.0.27 \ bin

我的問題是我該如何設置不同的目錄每個Web應用程序的地址?我有很多Web應用程序,其中一些使用相同的資源文件名。我不能只把它們放在一個目錄中。

請注意,我無法訪問jar文件的源代碼來更改。我只需要一種方法來設置jar文件使用的絕對路徑。

當我將WAR文件放在unix服務器上時,我遇到同樣的問題。提取WAR文件在服務器上的這個位置:

/data02/tools/Apache/Tomcat/apache-tomcat-6.0.37/webapps/BANNEROnline

但我想我應該把資源文件夾和在這個路徑的文件(moosavi3是我的用戶名!):

/家庭/ moosavi3

如何更改路徑?

+0

所以做的jar文件現在總是試圖從當前工作負載的資源目錄? –

+0

是的。 jar文件嘗試訪問當前工作目錄中的文件和文件夾。我不知道如何改變它。 – Soheil

+0

我們在談論什麼樣的jar文件?自產自銷? (爲什麼你沒有他們的來源?)開源? (同樣的問題)商業? (誰寫軟件與這些障礙?)可能是因爲你錯過了軟件上的配置選項?你如何將文件名傳遞給這些應用程序? –

回答

1

工作目錄是啓動java。[exe,bin]的目錄。我假設bin目錄是tomcat啓動腳本的位置?如果罐子都使用這個工作目錄,我不認爲有辦法讓不同的web應用程序有不同的工作目錄,它們都加載在同一個工作目錄的同一個jvm(java.exe)上。

工作目錄是從中啓動二進制文件的目錄,它不是您可以更改的任意值。

我懷疑這些jar文件意味着作爲獨立應用程序運行,並且期望它們嘗試訪問的文件系統資源與它們本身位於同一位置。

任何文件系統資源都必須移動到您的java.exe的位置,以便正確的文件路徑解析可以從您的jar中產生。

+0

我知道,tomcat會定期查看它爲資源安裝的目錄中的bin文件夾。我的問題是,當我有我自己的代碼時,我可以說第一個程序從「program1資源」獲取資源,第二個從相對路徑「program2資源」獲取資源。然後我將這些文件夾放在tomcat的bin目錄中,並將每個程序的資源放在它們自己的文件夾中。所以我可以組織它們。但是我在項目中使用的jar文件,他們需要訪問一些資源,並將其相對路徑設置爲「。」或tomcat的bin文件夾。我怎樣才能管理這個? – Soheil

+0

你不能做你在問什麼......閱讀我上面的答案,你不能指定工作目錄('。')...如果jar文件具有對工作目錄的硬編碼引用,那麼缺少更改jar代碼,沒有辦法指定一個不同的工作目錄。根據定義,工作目錄是二進制文件的起始位置,這適用於任何類型的二進制文件,而不僅僅是java.exe。操作系統總是會解釋'。'。作爲當前二進制進程從何處開始的含義。 – Edmond

+0

根據我自己的經驗,你所說的一定是真的。但是我希望找到一種方法來爲每個應用程序指定工作目錄,因爲將所有資源放在同一個目錄中看起來沒有很好的組織。 – Soheil

0

標準Servlet項目需要將外部庫放置在項目根下的'WEB-INF/lib'目錄中。你可以在谷歌搜索'servlet目錄結構'並且做你自己的研究以獲取更多信息。Web應用程序之間的共享庫可以放在tomcat根目錄下的'lib'目錄下,它們應該被tomcat jvm選中。我的建議是保持依賴性項目的特定性,因爲將來您可能需要在不同項目中使用不同的版本。

更新: 閱讀Tomcat文檔在這個頁面時,它會解釋不清楚該項目應如何構建,如何添加將在所有Web應用程序共享的庫:

http://tomcat.apache.org/tomcat-7.0-doc/appdev/deployment.html

更新2: 以下Stackoverflow鏈接解釋瞭如何將靜態文件添加到Web應用程序的幾個選項,這些選項將在運行時提供。

https://stackoverflow.com/a/2161583/940754

更新3: 使用項目清單添加路徑到classpath:

http://docs.oracle.com/javase/tutorial/deployment/jar/downman.html

+0

該文檔和stackoverflow後沒有幫助:( 我需要一種方式來更改jar文件開始讀取資源的相對路徑。我沒有訪問他們的代碼來使用classloader或類似的東西。 – Soheil

+0

是你告訴我你不能將項目特定的文件導入到項目文件夾中?webapp特定的類路徑將自動包含WEB-INF/lib和WEB-INF/classes。JVM自動掃描類路徑中的所有條目對於資源,因此當'jar文件開始讀取資源'時,類路徑中的任何資源都將被找到。 – ricksuggs

+0

確實如此。我已將資源放入WEB-INF/lib和WEB-INF/classes中,但該程序仍然無法識別它。 我寫的servlet可以訪問這兩個文件夾並且工作正常,但是庫jar文件不能。 – Soheil

相關問題