Jarファイルを生成し、すべての依存関係をtarget/lib
フォルダーにコピーするMavenプロジェクトがあります。このプロジェクトをクライアントのマシン(Windows)で実行したい。そこで、myproject.jar
をC:\xyz
フォルダーにコピーし、すべての依存関係をC:\xyz\lib
フォルダーにコピーしました。このプロジェクトをクライアントのコマンドプロンプトから実行するにはどうすればよいですか? Java -cp lib\*.jar -jar myproject.jar
フォルダーからC:\xyz
を使用しようとしましたが、次のエラーがスローされます。
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個のライブラリがあり、将来のリリースで成長する可能性があるため、これを行いたくありません。これを行うためのより良い方法はありますか?
Mavenにバッチファイルを生成させて、アプリケーションを起動します。これが最も簡単な方法です。
このような目的のために appassembler-maven-plugin を使用できます。
UNIXでJava 1.7を使用する-
Java -cp myjar.jar:lib/*:. mypackage.MyClass
Windowsでは、「;」を使用する必要がありますの代わりに ':' -
Java -cp myjar.jar;lib/*;. mypackage.MyClass
OSに関係なく、以下のコマンドが機能するはずです。
Java -cp "MyJar.jar;lib/*" com.mainClass
常に引用符を使用し、lib/*。jarが機能しないことに注意してください。
Maven-Assembly-pluginを使用できます。公式サイトの例を次に示します。 https://maven.Apache.org/plugins/maven-Assembly-plugin/usage.html
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-Assembly-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>your main class</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-Assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
可能な解決策は
バッチファイルを作成する
その中のすべてのファイルに対してlibディレクトリでループを実行し、各ファイルをクラスパスのlib側に設定します
その後、jarを実行します
source バッチファイルのループ用 ループに関する情報用
いくつかのオプションがあります。
最も簡単な方法は、おそらく execプラグイン です。
Assemblyプラグイン を使用して、すべての依存関係を含むjarを生成することもできます。
最後に、dependency:classpath
ゴールを使用して、クラスパスを含むファイルを生成できます。
私は同じ問題に直面していましたが、 Maven Shade Plugin を使用してすべての依存関係をjarファイルにパッケージ化することができました