回答:
落とし穴が少ないという理由だけで、Javaアプリケーションを開始する最初のバージョンを好んでいます(「クラスパスの地獄へようこそ」)。2つ目は実行可能なjarファイルを必要とし、そのアプリケーションのクラスパスはjarのマニフェスト内で定義する必要があります(他のすべてのクラスパス宣言は暗黙のうちに無視されます...)。したがって、2番目のバージョンでは、jarを調べ、マニフェストを読み取り、jarが格納されている場所からのクラスパスエントリが有効かどうかを確認する必要があります...これは回避できます。
どちらのバージョンでもパフォーマンス上の利点や欠点はありません。これは、メインスレッドに使用するクラスとライブラリの場所をjvmに通知するだけです。
では-cp
引数あなたはコンパイルまたは実行されたときにプログラムが必要とするかもしれないことに、追加のクラスまたはライブラリへのクラスパス、すなわちパス(複数可)を提供しています。を使用し-jar
て、実行する実行可能JARファイルを指定します。
両方を指定することはできません。実行しようとするjava -cp folder/myexternallibrary.jar -jar myprogram.jar
と、実際には機能しません。そのJARのクラスパスは、-cp
引数としてではなく、マニフェストで指定する必要があります。
この詳細については、こちらとこちらをご覧ください。
PS:-cp
と-classpath
は同義語です。
-cp
と-classpath
、その後、いや、違いはありません。
-jar
、実行する実行可能JARを指定します。では-cp
もしあなたのプログラムが必要とするかもしれないことを追加クラス/ライブラリへのパス(複数可)を指定します。2つには非常に異なる目的があります。
java -jar PATH -cp PATH2
クラスパスですべてのコードを指定する場合は、java -cp CLASSPATHが必要です。これはコードのデバッグに役立ちます。
jar実行可能形式:java -jar JarFile
1つの短いコマンドでアプリを起動する場合に使用できます。Class-Pathエントリでスペースで区切られたjarを使用して、MANIFESTで追加の依存jarファイルを指定できます。例:
Class-Path: mysql.jar infobus.jar acme/beans.jar
どちらもパフォーマンスに関しては同等です。
すでに述べたように、-cpは、メインスレッドに使用するクラスと、ライブラリを見つけることができる場所(クラスパスを定義)をコマンドラインでjvmに伝えるためのものです。-jarでは、jarファイルのマニフェストでクラスパスとメインクラスが定義されていると想定しています。したがって、他のものはコマンドラインで定義するためのものであり、他のものはjarマニフェスト内でそれらを見つけるためのものです。パフォーマンスに違いはありません。これらを同時に使用することはできません。-jarは-cpをオーバーライドします。
ただし、-cpを使用しても、マニフェストファイルはチェックされます。したがって、マニフェストでいくつかのクラスパスを定義し、コマンドラインでいくつかを定義することができます。これは、ビルドで提供していない、または提供したくないサードパーティのjarに依存している場合に特に便利です(たとえば、インストール先のシステムですでに検出されていることを期待します)。したがって、これを使用して外部jarを提供できます。その場所はシステムによって異なる場合があります。また、システムによってバージョンが異なる場合もあります(ただし、インターフェースは同じです)。このようにして、別のバージョンでアプリをビルドし、異なるシステムで実行するときに、コマンドラインで実際のサードパーティの依存関係をクラスパスに追加できます。
パフォーマンスの点で違いはありません。java-cpを使用して、Javaクラスファイルを実行するためにクラスパスで必要なクラスとjarを指定できます。
実行可能なjarファイルの場合。java -jarコマンドを使用すると、jvmは、jarファイル内の/META-INF/MANIFEST.MFファイルから実行する必要があるクラスを見つけます。