Javaアプリケーションの実行との違いは何ですかJava -cp CLASSPATH
およびJava -jar JAR_FILE_PATH
? Javaアプリケーションを実行するために、それらの1つが他よりも優先されますか?私はこれらの方法のどれがJVMにとってより高価であるかを意味します(マシンリソースの使用状況による)?
アプリケーションを実行しようとしているときに、JVMがより多くのスレッドを生成する原因になるのはどれですか?
Javaアプリケーションを開始する最初のバージョンのほうが、落とし穴が少ないからです(「ようこそクラスパス地獄」)。 2番目のものは実行可能なjarファイルを必要とし、そのアプリケーションのクラスパスはjarのマニフェスト内で定義する必要があります(他のすべてのクラスパス宣言は黙って無視されます...)。したがって、2番目のバージョンでは、jarを調べ、マニフェストを読んで、jarが保存されている場所からクラスパスエントリが有効かどうかを確認する必要があります。これは回避できます。
どちらのバージョンでも、パフォーマンスの利点や欠点はないと思います。メインスレッドに使用するクラスとライブラリを見つけることができる場所をjvmに伝えるだけです。
-cp
引数を使用すると、クラスパス、つまり、コンパイルまたは実行時にプログラムが必要とする可能性がある追加のクラスまたはライブラリへのパスを指定できます。 -jar
を使用して、実行する実行可能JARファイルを指定します。
両方を指定することはできません。 Java -cp folder/myexternallibrary.jar -jar myprogram.jar
を実行しようとすると、実際には機能しません。そのJARのクラスパスは、-cp
引数としてではなく、マニフェストで指定する必要があります。
これについての詳細は here および here をご覧ください。
PS:-cp
と-classpath
は同義語です。
Java -cp
を使用する場合は、完全修飾されたメインクラス名を指定する必要があります。
Java -cp com.mycompany.MyMain
Java -jar myjar.jar
を使用する場合、jarファイルは、フォルダーMETA-INF
のjarファイルに含まれるmanifest.mfを介してメインクラスに関する情報を提供する必要があります。
Main-Class: com.mycompany.MyMain
クラスパス内のすべてのコードを指定する場合は、Java -cp CLASSPATHが必要です。これはコードのデバッグに役立ちます。
単一の短いコマンドでアプリを起動する場合は、jar形式の実行可能形式:Java -jar JarFile
を使用できます。 Class-Pathエントリでスペースで区切られたjarを使用して、MANIFESTで追加の依存jarファイルを指定できます。
Class-Path: mysql.jar infobus.jar acme/beans.jar
どちらもパフォーマンスの点で同等です。
既に述べたように、-cpはコマンドラインでjvmにメインスレッドに使用するクラスと、ライブラリを見つけることができる場所(クラスパスを定義する)を伝えるためのものです。 -jarでは、class-pathとmain-classがjarファイルマニフェストで定義されることを想定しています。そのため、コマンドラインで物事を定義する一方で、jarマニフェスト内でそれらを見つけるためのものもあります。パフォーマンスに違いはありません。これらを同時に使用することはできません。-jarは-cpをオーバーライドします。
ただし、-cpを使用しても、マニフェストファイルはチェックされます。そのため、マニフェストでクラスパスをいくつか、コマンドラインでいくつかを定義できます。これは、ビルドで提供していない、または提供したくないサードパーティのjarに依存している場合に特に役立ちます(たとえば、インストールするシステムで既に検出されていることを期待します)。したがって、外部jarを提供するために使用できます。その場所はシステムによって異なる場合があります。また、異なるシステム上に異なるバージョンがある場合もあります(ただし、同じインターフェースを持っています)。このようにして、他のバージョンでアプリをビルドし、異なるシステムで実行するときに、コマンドラインでクラスパスに実際のサードパーティの依存関係を追加できます。
パフォーマンスの点で違いはありません。 Java-cpを使用して、Javaクラスファイルを実行するためのクラスパスで必要なクラスとjarを指定できます。
実行可能なjarファイルの場合。 Java -jarコマンドを使用すると、jvmはjarファイル内の/META-INF/MANIFEST.MFファイルから実行する必要があるクラスを見つけます。