2012-06-28 65 views
5

我們正在執行shell腳本的獨立Java程序,它有一個提供類路徑,路徑等的comman腳本。在這個通用腳本中,我們現在添加了幾個類路徑,字符數大於9000。 它在測試環境中工作正常。它會在生產中引起任何問題嗎?任何限制是在linux中設置類路徑?什麼是命令行輸入的最大字符數...Linux中的類路徑限制

+1

錯誤,測試環境在那裏驗證一切工作正常,然後在生產中做同樣的事情。如果你不相信你的測試環境,爲什麼你會有一個? –

+2

環境變量的可用時間有限制,並且命令行可以有多長時間有限制。你*可以*達到那種長度的那兩種(不知道爐旁任何操作系統的具體數字)。您可能想要開始使用[classpath wildcards](http://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html)。 –

+1

@JB:理論上,測試和生產環境應該是相同的,並且在理論上如果測試工作在測試中,它將在生產中工作。然而,理論與實踐的區別在理論上,理論與實踐並無區別。 –

回答

0

請參閱this stackoverflow answer關於最大linux命令行長度。

最大命令行長度大致在128KB到2MB之間。

但是,任何一個參數的最大尺寸要小得多,而9000個字符可能有問題。

0

當您在的Java程序使用從在classpath變量指定的jar文件中的一些班,JVM不會加載類,直到你正在運行的程序會明確需要一個類(或者,如果你從代碼中明確加載該類 - 同樣的想法)。當您有很長的classpath時,可能出現的唯一問題是classpathJVM找到正確的jar文件之前檢查所需的時間。但這應該不成問題。如果你的程序在測試中表現良好,你不應該爲此擔心。

4

不,沒有限制。在Windows中有(8191個字符),但不在Linux下。我們使用classpath-files的概念。這些文件列出了所有的依賴關係的應用,例如:

... 
libs/org/easymock/easymock/2.2/easymock-2.2.jar 
libs/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar 
libs/org/hibernate/hibernate-envers/4.1.0.Final/hibernate-envers-4.1.0.Final.jar 
libs/com/google/inject/guice/3.0/guice-3.0.jar 
... 

,然後我們把這個成可用的類路徑和運行應用程序如下:

#!/bin/bash 

CLASSPATH_FILE=`ls -r1 ${APP-HOME}/classpaths/myapp*.classpath | head -n1` 
CLASSPATH=$(cat $CLASSPATH_FILE | sed 's_^libs_ ${APP-HOME}/libs_' | tr -d '\n' | tr -d '\r' | sed 's_.jar/libs/_.jar:/libs/_g' | sed 's_.pom/libs/_.pom:/libs/_g') 

java -d64 -cp $CLASSPATH com.blah.main.Main [email protected] 

我們從來沒有遇到的問題和這些類路徑條目變得非常巨大。

編輯:作爲一個方面說明,你可以使用maven依賴插件來生成依賴關係列表。

+3

我不同意Linux沒有限制。對於較老的(2.6.5)內核,我們絕對已經達到了命令行長度的128KB的硬限制。 – QuantumMechanic

+0

... Linux永遠不會讓我驚歎。好,然後修正:真正的操作系統不應該給你任何問題。 :-)(我在上面做了必要的修改,感謝QuantumMechanic) –