シェルスクリプトからスタンドアロンのJavaプログラムを実行しており、クラスパスやパスなどを指定するコンマスクリプトがあります。この一般的なスクリプトでは、現在いくつかのクラスパスを追加しており、文字数は9000を超えています。テストでは正常に機能しています。環境 本番環境で問題が発生しますか?Linuxにはクラスパスを設定するための制限がありますか?コマンドライン入力の最大文字数はいくつですか。
3 に答える
いいえ、制限はありません。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 $@
問題が発生したことはなく、これらのクラスパスエントリはかなり巨大になります。
編集:補足として、Maven依存関係プラグインを使用して依存関係のリストを生成できます。
Linuxコマンドラインの最大長については、このstackoverflowの回答を参照してください。
コマンド ラインの最大長は、およそ 128KB から 2MB の間です。
ただし、1 つの引数の最大サイズはかなり小さく、9000 文字は問題になる可能性があります。
Javaプログラムで、変数でjar
指定されたファイルからいくつかのクラスを使用する場合、 JVMは、実行中のプログラムがそのクラスを明示的に必要とするまで (またはコードからそのクラスを明示的にロードする場合は同じです)、そのクラスをロードしません。考え)。が非常に長い場合に発生する可能性がある唯一の問題は、 JVMが正しいファイルを見つける前にチェックに必要な時間です。しかし、それは問題ではありません。プログラムがテストでうまく動作する場合、これについて心配する必要はありません。classpath
classpath
classpath
jar