「java -cp」と「java -jar」の違いは何ですか?


118

でJavaアプリケーションを実行しているとの違いは何である
java -cp CLASSPATHとはjava -jar JAR_FILE_PATH?Javaアプリケーションを実行するために、どちらか一方が他方よりも優先されますか?これらの方法のうち、JVMの方が(マシンリソースの使用状況に応じて)コストが高いのはどれですか。

アプリケーションを実行しようとしたときに、JVMがより多くのスレッドを生成するのはどれですか。

回答:


97

落とし穴が少ないという理由だけで、Javaアプリケーションを開始する最初のバージョンを好んでいます(「クラスパスの地獄へようこそ」)。2つ目は実行可能なjarファイルを必要とし、そのアプリケーションのクラスパスはjarのマニフェスト内で定義する必要があります(他のすべてのクラスパス宣言は暗黙のうちに無視されます...)。したがって、2番目のバージョンでは、jarを調べ、マニフェストを読み取り、jarが格納されている場所からのクラスパスエントリが有効かどうかを確認する必要があります...これは回避できます。

どちらのバージョンでもパフォーマンス上の利点や欠点はありません。これは、メインスレッドに使用するクラスとライブラリの場所をjvmに通知するだけです。


スレッドはどうですか?アプリケーションを実行しようとしたときにJVMが生成するスレッドの数は同じですか?
Reza

1
はい。どちらのバージョンでもmainメソッドが見つかり、単一のスレッドで実行されます。最初のバージョンはクラス名を引数として渡します。2番目のバージョンでは、jvmはそれをmainfest内で見つけます。
Andreas Dolk

@Andreas_Dこの投稿をご覧ください。-cpを間違った方法で使用していると思います。間違いを修正する方法はありません。
fu DL

60

では-cp引数あなたはコンパイルまたは実行されたときにプログラムが必要とするかもしれないことに、追加のクラスまたはライブラリへのクラスパス、すなわちパス(複数可)を提供しています。を使用し-jarて、実行する実行可能JARファイルを指定します。

両方を指定することはできません。実行しようとするjava -cp folder/myexternallibrary.jar -jar myprogram.jarと、実際には機能しません。そのJARのクラスパスは、-cp引数としてではなく、マニフェストで指定する必要があります。

この詳細については、こちらこちらをご覧ください

PS:-cp-classpathは同義語です。


私の懸念はリソースについてですか?彼らが使用するリソース間に違いはありますか?
Reza

@Hesamあなたは、パフォーマンスの違いについて尋ねている場合-cp-classpath、その後、いや、違いはありません。
Radu Murzea

1
番号!-cp(または-classpath)と-jarのパフォーマンスの違いを意味します
Reza

2
@Hesamで-jar、実行する実行可能JARを指定します。では-cpもしあなたのプログラムが必要とするかもしれないことを追加クラス/ライブラリへのパス(複数可)を指定します。2つには非常に異なる目的があります。
Radu Murzea

@RaduMurzea、私たちがそれらを組み合わせるとき、それが実際に機能しないとはどういう意味ですか?例java -jar PATH -cp PATH2
パセリエ2014

18

使用java -cpする場合、完全修飾されたメインクラス名を提供する必要があります。

java -cp com.mycompany.MyMain

java -jar myjar.jarjarファイルを使用する場合は、フォルダー内のjarファイルに含まれるmanifest.mfを介してメインクラスに関する情報を提供する必要がありますMETA-INF

Main-Class: com.mycompany.MyMain


この投稿をご覧ください。- cpを間違った方法で使用していると思います。間違いを修正する方法はありません。
fu DL

10

クラスパスですべてのコードを指定する場合は、java -cp CLASSPATHが必要です。これはコードのデバッグに役立ちます。

jar実行可能形式:java -jar JarFile1つの短いコマンドでアプリを起動する場合に使用できます。Class-Pathエントリでスペースで区切られたjarを使用して、MANIFESTで追加の依存jarファイルを指定できます。例:

Class-Path: mysql.jar infobus.jar acme/beans.jar

どちらもパフォーマンスに関しては同等です。


この投稿をご覧ください。- cpを間違った方法で使用していると思います。間違いを修正する方法はありません。
fu DL

2

すでに述べたように、-cpは、メインスレッドに使用するクラスと、ライブラリを見つけることができる場所(クラスパスを定義)をコマンドラインでjvmに伝えるためのものです。-jarでは、jarファイルのマニフェストでクラスパスとメインクラスが定義されていると想定しています。したがって、他のものはコマンドラインで定義するためのものであり、他のものはjarマニフェスト内でそれらを見つけるためのものです。パフォーマンスに違いはありません。これらを同時に使用することはできません。-jarは-cpをオーバーライドします。

ただし、-cpを使用しても、マニフェストファイルはチェックされます。したがって、マニフェストでいくつかのクラスパスを定義し、コマンドラインでいくつかを定義することができます。これは、ビルドで提供していない、または提供したくないサードパーティのjarに依存している場合に特に便利です(たとえば、インストール先のシステムですでに検出されていることを期待します)。したがって、これを使用して外部jarを提供できます。その場所はシステムによって異なる場合があります。また、システムによってバージョンが異なる場合もあります(ただし、インターフェースは同じです)。このようにして、別のバージョンでアプリをビルドし、異なるシステムで実行するときに、コマンドラインで実際のサードパーティの依存関係をクラスパスに追加できます。


1

パフォーマンスの点で違いはありません。java-cpを使用して、Javaクラスファイルを実行するためにクラスパスで必要なクラスとjarを指定できます。

実行可能なjarファイルの場合。java -jarコマンドを使用すると、jvmは、jarファイル内の/META-INF/MANIFEST.MFファイルから実行する必要があるクラスを見つけます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.