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ファイルを実行して、使用するクラスパスを指定する方法を教えてください。
-jar
を指定すると、-cp
パラメータは無視されます。
から ドキュメント :
このオプションを使用すると、JARファイルがすべてのユーザークラスのソースになり、他のユーザークラスパス設定は無視されます。
また、必要なjarファイルを別のjarファイルに「含める」ことはできません(その内容を抽出して.classファイルをあなたのjarファイルに入れる必要があります)。
2つの選択肢があります。
lib
ディレクトリからマニフェストにすべてのjarファイルを含めます(そこでは相対パスを使用できます)。-cp
を使用して、コマンドラインですべての((jarを含むを含む)を指定します。Java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main
Jarファイルを実行して、次のようにクラスパスを指定します。
Java -cp <jar_name.jar:libs/*> com.test.App
jar_name.jar
は実行したいJARのフルネームです。
libs/*
はあなたの依存関係JARへのパスです
com.test.App
は、main(String[])
メソッドを持つJARからのクラスの完全修飾名です。
Jarとその依存jarには実行権限が必要です。
あるいは、マニフェストを使用して、必要に応じてクラスパスとメインクラスを指定するので、-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
あなたはUnixシェルでこれらを行うことができます:
Java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main
あなたはwindowsのPowerShellでこれらを行うことができます:
Java -cp "MyJar.jar;lib\*" com.somepackage.subpackage.Main