コマンドラインからJARファイルを実行し、クラスパスを指定します


115

JARファイルをコンパイルし、マニフェストでMain-Classを指定しました(Eclipse エクスポート機能を使用しました)。私の依存関係はすべて、というラベルの付いたディレクトリにありlibます。lib/*クラスパスとして使用する必要があることを指定しながら、JARファイルを実行する方法について簡単な答えが得られないようです。

私はもう試した:

]$ java -jar -cp .:lib/* MyJar.jar
]$ java -cp .:lib/* -jar MyJar.jar
]$ java -cp .:lib/* com.somepackage.subpackage.Main

等...

それぞれが言うエラーを与えます:

Error: Could not find or load main class ....

またはNoClassDefFoundError、ライブラリが見つからないことを示します。

JARファイルを作り直してみて、libディレクトリとコンテンツを含めましたが、まだサイコロはありません...

コマンドラインからJARファイルを実行し、使用するクラスパスを指定するにはどうすればよいですか?


回答:


204

指定する-jarと、-cpパラメーターは無視されます。

ドキュメントから:

このオプションを使用すると、JARファイルはすべてのユーザークラスのソースとなり、他のユーザークラスパス設定は無視されます。

また、必要なjarファイルを別のjarファイルに「含める」こともできません(それらのコンテンツを抽出し、.classファイルをjarファイルに入れる必要があります)。

次の2つのオプションがあります。

  1. libディレクトリからマニフェストにすべてのjarファイルを含めます(そこで相対パスを使用できます)
  2. 以下を使用して、コマンドラインですべて(jar を含む指定します-cp
    java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main

22
; 代わりに:次のようにウィンドウを使用する場合java -cp MyJar.jar; lib / * com.somepackage.subpackage.Main
エラー

また、必要なjarファイルを別のjarファイルに「含める」こともできません。できますよ。内部で使用する場合(つまり、ユーザーに技術的なスキルがあることを期待している場合)、jarを実行する前に、ステップ1を実行するように依頼するだけunzip MyJar.jar lib/*.jarです。その後、あなたが提案するように、彼らは走ることができますjava -cp MyJar.jar:lib/* ...
ロジャー

3
残念なのは、外部のサーバー固有のプロパティファイルへの参照を使用して「すべてを含む」uber jarを実行する一般的な使用例です。明らかにブロッカーではありませんが、-jarを使用してメインを指定する必要がない場合は、確かにそれほど冗長ではないコマンドです
Andrew Norman

理解するのにしばらくかかった。また、log4jファイルを明示的にロードするには、約6行かかります。決して修正されないもう1つのJavaバグ。
調整可能

1
マニフェストClass-Pathは、jarファイルのロードにのみ使用できることに注意してください。たとえば、log4j3.xmlの検索には使用できません。よかった
調整可能

34

jarファイルを実行して、次のようなクラスパスを指定します。

java -cp <jar_name.jar:libs/*> com.test.App

jar_name.jar 実行するJARの完全な名前です

libs/* 依存関係JARへのパスです

com.test.Appmain(String[])メソッドを持つJARのクラスの完全修飾名です

jarおよび依存jarには実行権限が必要です。


10

あなたはUNIXシェルでこれらを行うことができます:

java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main

あなたはwindows powershellでこれらを行うことができます:

java -cp "MyJar.jar;lib\*" com.somepackage.subpackage.Main

4

または、必要に応じてマニフェストを使用してクラスパスとメインクラスを指定するので-cp、メインクラスを使用したり指定したりする必要はありません。あなたの場合、次のような行が含まれます:

Main-Class: com.test.App
Class-Path: lib/one.jar lib/two.jar

残念ながら、マニフェスト内の各jarを綴る必要があります(1回だけ行うので大したことではありません。スクリプトを使用してファイルをビルドしたり、ANT、Maven、Gradleなどのビルドツールを使用したりできます)。参照は、を実行する場所への相対または絶対ディレクトリでなければなりませんjava -jar MyJar.jar

次に、それを実行します

java -jar MyJar.jar

Class-Pathは外部jar内のファイルを参照する必要があると思います。MyJar.jar外の設定ファイルを参照するために、これを一般的に機能させることができませんでした。
調整可能

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