web-dev-qa-db-ja.com

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

JAR ファイルをコンパイルし、マニフェストでメインクラスを指定しました(Eclipseエクスポート関数を使用しました) )私の依存関係はすべてlibという名前のディレクトリにあります。 JARファイルを実行する方法について、クラスパスとしてlib/*を使用するように指定しても、正解は得られません。

私はもう試した:

]$ 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ファイルを実行して、使用するクラスパスを指定する方法を教えてください。

98
SnakeDoc

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

から ドキュメント

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

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

2つの選択肢があります。

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

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

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

jar_name.jarは実行したいJARのフルネームです。

libs/*はあなたの依存関係JARへのパスです

com.test.Appは、main(String[])メソッドを持つJARからのクラスの完全修飾名です。

Jarとその依存jarには実行権限が必要です。

29
Sid

あるいは、マニフェストを使用して、必要に応じてクラスパスとメインクラスを指定するので、-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
4
HankCa

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

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

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

Java -cp "MyJar.jar;lib\*" com.somepackage.subpackage.Main
4
tars