私はMavenのマントラは比較的新しいですが、Mavenでコマンドラインの実行可能なjarを作成しようとしています。依存関係を設定しましたが、実行するとmvn install
とjarを実行しようとすると、2つのことが起こります。最初に、修正可能なメインクラスが見つかりません。これを修正すると、実行時にクラスが見つからないというエラーが表示されます。
Mavenは依存ライブラリをjar内にパッケージ化していないため、jarをスタンドアロンアプリケーションとして実行できません。これを修正するにはどうすればよいですか?
これを行う最も簡単な方法は、maven-Assembly-plugin
および事前定義されたjar-with-dependencies
記述子を使用してアセンブリを作成することです。また、このuber jarのメインクラスエントリを持つマニフェストを生成する必要があります。以下のスニペットは、アセンブリプラグインを設定する方法を示しています。
<build>
<plugins>
<plugin>
<artifactId>maven-Assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
次に、アセンブリを生成するには、次を実行します。
mvn Assembly:assembly
ビルドの一部としてアセンブリを生成する場合は、Assembly:single
mojoをパッケージフェーズにバインドするだけです。
<build>
<plugins>
<plugin>
<artifactId>maven-Assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
そして、単に実行します:
mvn package
Mavenはjarファイル内に依存関係をパッケージ化しません。これは、通常Javaプログラムでこれを行うことはないためです。
代わりに、jarファイルと一緒に依存関係を提供し、それらを マニフェストのClass-Path
ヘッダー に記述します。
このルートを使用するには、 maven-jar-plugin
のaddClasspath
プロパティ( here に記載)を有効にする必要があります。
すべての依存関係をjarファイルに本当に含めたい場合は、Maven Assemblyプラグインを使用して jar-with-dependencies
を作成できます。
これは、私が小さなプロジェクトに対して行うことです。ほとんどの場合、1つの大きなjarファイルは必要ありません。
ビルドする: mvn cleandependency:copy-dependencies package
実行する(ターゲットディレクトリ): Java -cp myjar.jar:./ dependency/* com.something.MyClass
ヨアヒム・ザウアーに同意します
Jar-with-dependencyを使用する代わりに、pom.xmlでそのようなjarプラグインを構成する必要があります。
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<index>true</index>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>[mainClassFullName]</mainClass>
</manifest>
<manifestEntries>
<mode>development</mode>
<url>${project.url}</url>
<key>value</key>
</manifestEntries>
</archive>
</configuration>
</plugin>
そして、このアセンブリ構成を使用して、jar依存関係をアセンブリに追加します。
<Assembly xmlns="http://maven.Apache.org/plugins/maven-Assembly-plugin/Assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.Apache.org/plugins/maven-Assembly-plugin/Assembly/1.1.0 http://maven.Apache.org/xsd/Assembly-1.1.0.xsd">
<id>Zip-with-jars</id>
<formats>
<format>Zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySets>
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<unpack>false</unpack>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
</dependencySets>
</Assembly>
以下のコードをpom.xmlに追加し、実行:maven:installを実行します。 jarはEclipseのターゲットフォルダに作成され、「Java -jar Hello.jar」として使用できます。ただし、メインクラスの名前がcom.abc.HelloWorld.Javaに指定されていることを確認してください
<build>
<plugins>
<plugin>
<groupid>org.Apache.maven.plugins</groupid>
<artifactid>maven-shade-plugin</artifactid>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<finalname>HelloW</finalname>
<transformers>
<transformer implementation="org.Apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestentries>
<main-class>com.abc.HelloWorld.Java</main-class>
<build-number>1</build-number>
</manifestentries>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>