シェルスクリプトからスタンドアロンのJavaプログラムを実行しています。クラスパス、パスなどを記述するためのコマンドがあります。この共通のスクリプトでは、現在いくつかのクラスパスが追加されており、文字数は9000を超えています。 テスト環境で正常に動作しています。プロダクションで問題が生じるのでしょうか?クラスパスを設定するには、Linuxに制限がありますか?コマンドライン入力の最大文字数は...Linuxのクラスパス制限
答えて
最大linuxコマンドラインの長さについては、this stackoverflow answerを参照してください。
コマンドラインの最大長は、およそ128KBから2MBです。
いずれの引数の最大サイズもかなり小さくなりますが、9000文字が問題になる可能性があります。
あなたのJavaプログラムclasspath
変数で指定されたjar
ファイルからいくつかのクラスで使用する場合、実行中のプログラムが明示的にそのクラスを必要とする(または場合だろうまで、JVMは、そのクラスをロードしませんそのクラスをコードから明示的にロードする - 同じ考え方)。 classpath
が非常に長い場合に表示される唯一の問題は、classpath
がJVMになる前に確認するのに必要な時間です。jar
というファイルが見つかりました。しかし、それは問題ではありません。あなたのプログラムがテストでうまく動作するならば、これについて心配するべきではありません。
いいえ、制限はありません。 Windowsには8191文字ありますが、Linuxではありません。クラスパスファイルの概念を扱います。これらのファイルリストアプリケーションのすべての依存関係、例えば:
...
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]
我々が問題とこれらのクラスパスに遭遇したことがありませんエントリはかなり巨大になる。
EDIT:maven依存関係プラグインを使用して依存関係のリストを生成することができます。
私はLinuxには制限がないと言います。古い(2.6.5)カーネルでは、コマンドラインの長さに対して絶対に128KBという厳しい制限がありました。 – QuantumMechanic
... Linuxは決して私を驚かせない。 OK、修正:実際のオペレーティングシステムでは問題はありません。 :-)(私は上記の必要な変更を行った、ありがとうQuantumMechanic) –
エラーが発生しました。テスト環境では、本番環境で同じことを行う前にすべてがうまく動作することを検証するためにあります。あなたのテスト環境を信頼しない場合、なぜあなたはそれを持っていますか? –
環境変数の長さには限界があり、コマンドラインの長さには制限があります。あなたは、そのような長さの人の両方に達することができました(炉床によって特定のOSの具体的な数字はわかりません)。 [クラスパスのワイルドカード](http://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html)の使用を開始することもできます。 –
@JB:理論的には、テスト環境とプロダクション環境は同じでなければならず、理論的にはテスト環境で動作していれば、実稼働環境で動作します。しかし、理論と実践の違いは、理論的には理論と実践の間に違いがないということです。コマンドラインで9000文字のクラスパスではなく –