2010-04-20 47 views
1

java jar文件中的Manifest文件中是否必須具有classpath?我們可以在沒有classpath的情況下工作嗎?關於Java jar文件中的清單問題

我問這是因爲我有一個服務器應用程序的jar文件。當我嘗試連接多個與服務器的連接時,服務器出現故障,錯誤是「打開的文件過多」,當搜索到它時,我發現一個Sun Bug http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6446657。然後我檢查了我在Jar文件中有一個類路徑條目。所以這個問題就出現了。

編輯:我對於Filr碼讀的是:

// Creating a new File instance 
    File file= new File(fileName); 

    // Creates a DataInputStream that uses the specified underlying InputStream. 
    DataInputStream input = new DataInputStream(new FileInputStream(file)); 
    Data = new byte[(int)file.length()]; 

    // Reads bytes from the input stream and stores them into the buffer array Data. 
    input.read(Data); 

    // Closes this input stream and releases any system resources associated with the stream. 
    input.close(); 

是什麼錯,導致了太多筆的文件?

+1

這個bug在4年前已經修復。你的問題在別的地方。 – BalusC 2010-04-20 19:36:25

+0

你沒有試過嗎? 如果你的jar文件依賴於其他jar文件,你只需要類路徑。 – 2010-04-20 19:39:58

+0

嗨Baluc,我在一個地方從一個文件讀取字節,這是唯一的文件讀取操作。我有一個ReadBytes函數,它接受文件名,然後以字節返回內容。那麼我可以看到這是唯一的罪魁禍首,但無法找到究竟是什麼錯誤。有什麼建議麼? – 2010-04-20 19:48:23

回答

1

該條目是完全可選的,但是您指向的錯誤與編譯有關,而不是運行時,所以這不太可能是這個問題。

應用程序服務器通常非常餓,如果沒有做任何事情來增加打開文件的限制,默認值可能不夠高。

在CentOS上,我們發現,即使在QA(不是負載測試,只是功能測試),服務器也可以通過JBoss 4.2來最大化它的ulimit。

編輯:你在張貼保存文件方面發佈的代碼唯一錯誤是你應該使用finally來關閉你的流。在一個服務器應用程序中,這可能是因爲這段代碼經常拋出一個異常,導致文件不能關閉(因爲你沒有關閉它們),隨着時間的推移,這些打開的文件句柄會加起來。還有其他問題在你如何做(像依靠available()來確定字節數組的大小),但這不應該影響你的問題。

另一種可能性是,在* nix系統下,套接字使用與文件相同的資源,所以可能是因爲你有太多的套接字(超出系統配置允許的範圍)打開,導致這些代碼無法執行。

0

Jar清單文件中的Class-Path條目完全是可選的,許多工作的Jar文件不使用該字段。

0

可執行JAR必須通過清單文件的Class-Path頭引用它需要的所有其他依賴JAR。如果使用-jar選項,則JVM將忽略命令行上指定的環境變量CLASSPATH和任何類路徑。除此之外,你與bug數據庫的鏈接表明它是一個封閉的bug。

0

確保在閱讀文件後關閉文件。

如果您正在將文件的內容讀入循環中的字節數組中,您在閱讀下一個文件之前是否關閉了文件?

+0

我在文件這樣做閱讀: \t \t \t //創建一個新的文件實例 \t \t \t文件FileToBeRead =新的文件(文件名); \t \t \t \t \t \t //創建一個使用指定的基礎InputStream的DataInputStream。 DataInputStream input = new DataInputStream(new FileInputStream(FileToBeRead));}}數據=新字節[(int)FileToBeRead.length()]; \t \t \t \t \t \t //從輸入流中讀取字節並將它們存儲到緩衝區數組Data中。 \t \t \t input.read(Data); \t \t \t \t \t \t //關閉此輸入流並釋放與該流關聯的所有系統資源。 \t \t \t input.close(); – 2010-04-20 20:14:48