私は、jarファイルを生成し、すべての依存関係をtarget/lib
フォルダにコピーするMavenプロジェクトを持っています。 このプロジェクトをクライアントのマシン(Windows)で実行したいと考えています。 そこで、「myproject.jar」を「C:˶ˆ꒳ˆ˵」に、依存関係にあるものを「C:˶ˆ꒳ˆ˵」にコピーしました。 クライアントのコマンドプロンプトからこのプロジェクトを実行するにはどうしたらいいですか?
C:˶ˆ꒳ˆ˵ "java -cp lib*.jar -jar myproject.jar "を使ってみましたが、以下のようなエラーが発生しました。
Exception in thread "main" java.lang.NoClassDefFoundError: lib\commons-codec-1/3/jar
Caused by: java.lang.ClassNotFoundException: lib\commons-codec-1.3.jar
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: lib\commons-codec-1.3.jar. Program will exit.
すべての依存関係をクラスパスに指定すれば(java -cp lib\dep1.jar;dep2.jar
のように)、問題は解消されると思うのですが、すでに40個のライブラリがあり、今後のリリースで増えるかもしれないので、このようなことはしたくありません。 何か良い方法はありますか?
可能な解決策としては
バッチファイルの作成
そこでは、libディレクトリ内のすべてのファイルをループし、lib以外の各ファイルをクラスパスに設定します。
その後、jarを実行します。
ループに関する情報はfor loop in batch fileを参照してください。
いくつかの選択肢があります。
最も簡単なのは、exec pluginでしょう。
また、assembly pluginを使って、すべての依存関係を含むjarを生成することもできます。
最後に、dependency:classpath
ゴールを使って、クラスパスを含んだファイルを生成することができます。
これではjava -cp lib\*.jar -jar myproject.jar
とはなりません。jarごとに入れる必要があります。
つまり、commons-codec-1.3.jar
の場合は。
java -cp lib/commons-codec-1.3.jar;lib/next_jar.jar`のようになります。
もうひとつの解決策は、すべてのjarをJREのext
ディレクトリに置くことです。これは、スタンドアロンのJREを使用している場合には問題ありません。同じJREを使って複数のアプリケーションを実行する場合は、この方法はお勧めできません。