私のプロジェクトを配布するために単一の実行可能JARにパッケージ化したいです。
Mavenプロジェクトですべての依存関係JARを出力JARにパッケージ化する方法を教えてください。
<build>
<plugins>
<plugin>
<artifactId>maven-Assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
そしてあなたはそれを実行します
mvn clean compile Assembly:single
コンパイルの目標は、アセンブリの前に追加する必要があります。それ以外の場合は、自分のプロジェクトのコードは含まれません。
コメントで詳細を見てください。
通常、この目標は自動的に実行されるビルドフェーズに関連付けられています。これにより、mvn install
の実行時またはデプロイメント/リリースの実行時にJARが確実に構築されます。
<plugin>
<artifactId>maven-Assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</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>
Dependency-pluginを使用して、パッケージフェーズの前にすべての依存関係を別のディレクトリに生成し、それをマニフェストのクラスパスに含めることができます。
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>theMainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
あるいは、${project.build.directory}/classes/lib
をOutputDirectoryとして使用してすべてのjarファイルをメインのjarファイルに統合しますが、jarをロードするためのカスタムクラスローディングコードを追加する必要があります。
私はこれを行うためのいくつかの異なる方法についてブログを書きました。
を参照してくださいApache Mavenで実行可能なjarファイル (ワードプレス)
または maven-exampleの実行可能jar (GitHub)
それらの賛否両論は Stephan によって提供されています。
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/${project.build.finalName}.lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>${project.build.finalName}.lib/</classpathPrefix>
<mainClass>${fully.qualified.main.class}</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
この時点でjar
は実際には外部のクラスパス要素で実行可能です。
$ Java -jar target/${project.build.finalName}.jar
jar
ファイルは、兄弟...lib/
ディレクトリでのみ実行可能です。ディレクトリとそのコンテンツとともに展開するアーカイブを作成する必要があります。
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>antrun-archive</id>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<property name="final.name" value="${project.build.directory}/${project.build.finalName}"/>
<property name="archive.includes" value="${project.build.finalName}.${project.packaging} ${project.build.finalName}.lib/*"/>
<property name="tar.destfile" value="${final.name}.tar"/>
<Zip basedir="${project.build.directory}" destfile="${final.name}.Zip" includes="${archive.includes}" />
<tar basedir="${project.build.directory}" destfile="${tar.destfile}" includes="${archive.includes}" />
<gzip src="${tar.destfile}" destfile="${tar.destfile}.gz" />
<bzip2 src="${tar.destfile}" destfile="${tar.destfile}.bz2" />
</target>
</configuration>
</execution>
</executions>
</plugin>
target/${project.build.finalName}.(Zip|tar|tar.bz2|tar.gz)
があり、それぞれにjar
とlib/*
が含まれています。
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-Assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<archive>
<manifest>
<mainClass>${fully.qualified.main.class}</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</execution>
</executions>
</plugin>
target/${project.bulid.finalName}-jar-with-dependencies.jar
があります。
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<shadedArtifactAttached>true</shadedArtifactAttached>
<transformers>
<transformer implementation="org.Apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>${fully.qualified.main.class}</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
target/${project.build.finalName}-shaded.jar
があります。
<plugin>
<!--groupId>org.dstovall</groupId--> <!-- not available on the central -->
<groupId>com.jolira</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<executions>
<execution>
<configuration>
<mainClass>${fully.qualified.main.class}</mainClass>
<attachToBuild>true</attachToBuild>
<!-- https://code.google.com/p/onejar-maven-plugin/issues/detail?id=8 -->
<!--classifier>onejar</classifier-->
<filename>${project.build.finalName}-onejar.${project.packaging}</filename>
</configuration>
<goals>
<goal>one-jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>spring-boot</classifier>
<mainClass>${fully.qualified.main.class}</mainClass>
</configuration>
</execution>
</executions>
</plugin>
target/${project.bulid.finalName}-spring-boot.jar
があります。
未回答の回答を取り、それを再フォーマットすると、次のようになります。
<build>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<artifactId>maven-Assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
次に、明示的に呼び出すものではなく、これをビルドの自然な部分にすることをお勧めします。これをビルドの不可欠な部分にするには、このプラグインをpom.xml
に追加し、それをpackage
ライフサイクルイベントにバインドします。ただし、これをpom.xmlに入れる場合はAssembly:single
ゴールを呼び出す必要がありますが、コマンドラインから手動で実行する場合は 'Assembly:assembly'を呼び出す必要があります。
<project>
[...]
<build>
<plugins>
<plugin>
<artifactId>maven-Assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-my-jar-with-dependencies</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
[...]
</plugins>
[...]
</build>
</project>
Maven-shade-pluginを使用して、すべての依存関係を1つのuber-jarにパッケージ化します。メインクラスを指定して実行可能jarを構築するためにも使用できます。 maven-Assemblyとmaven-jarを使おうとしたところ、このプラグインが自分のニーズに最も適していることがわかりました。
このプラグインは、上書きするのではなく特定のファイルの内容をマージするので特に便利です。これは、jarファイルに同じ名前のリソースファイルがあり、プラグインがすべてのリソースファイルをパッケージ化しようとしている場合に必要です。
下記の例をご覧ください
<plugins>
<!-- This plugin provides the capability to package the artifact in an uber-jar, including its dependencies and to shade - i.e. rename - the packages of some of the dependencies. -->
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<!-- signed jars-->
<excludes>
<exclude>bouncycastle:bcprov-jdk15</exclude>
</excludes>
</artifactSet>
<transformers>
<transformer
implementation="org.Apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<!-- Main class -->
<mainClass>com.main.MyMainClass</mainClass>
</transformer>
<!-- Use resource transformers to prevent file overwrites -->
<transformer
implementation="org.Apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>properties.properties</resource>
</transformer>
<transformer
implementation="org.Apache.maven.plugins.shade.resource.XmlAppendingTransformer">
<resource>applicationContext.xml</resource>
</transformer>
<transformer
implementation="org.Apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/cxf/cxf.extension</resource>
</transformer>
<transformer
implementation="org.Apache.maven.plugins.shade.resource.XmlAppendingTransformer">
<resource>META-INF/cxf/bus-extensions.xml</resource>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
長い間 mavenアセンブリプラグイン を使用していましたが、 "already added, skipping"
に関する問題の解決策が見つかりませんでした。今、私は別のプラグインを使用しています - onejar-maven-plugin 。以下の例(mvn package
build jar):
<plugin>
<groupId>org.dstovall</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<version>1.3.0</version>
<executions>
<execution>
<configuration>
<mainClass>com.company.MainClass</mainClass>
</configuration>
<goals>
<goal>one-jar</goal>
</goals>
</execution>
</executions>
</plugin>
そのプラグインのリポジトリを追加する必要があります。
<pluginRepositories>
<pluginRepository>
<id>onejar-maven-plugin.googlecode.com</id>
<url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url>
</pluginRepository>
</pluginRepositories>
Maven-dependency-pluginを使うことができますが、問題は実行可能なJARをどのように作成するかでした。これを行うには、Matthew Franglenの応答を次のように変更する必要があります(ところで、依存関係プラグインを使用すると、クリーンターゲットから起動するとビルドに時間がかかります)。
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack-dependencies</id>
<phase>package</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<resource>
<directory>${basedir}/target/dependency</directory>
</resource>
</resources>
</build>
単一の結果のJAR内に他のJARコンテンツを本当に再パッケージ化したい場合のもう1つのオプションは Maven Assemblyプラグイン です。それは<unpack>true</unpack>
を通してそれを解凍しそして次にディレクトリに再パックします。次に、それを1つの巨大なJARに組み込んだセカンドパスがあります。
他の選択肢はOneJarプラグインです 。これにより、上記の再パッケージ化アクションがすべて1ステップで実行されます。
pom.xml に以下を追加できます。
<build>
<defaultGoal>install</defaultGoal>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.mycompany.package.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<artifactId>maven-Assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.mycompany.package.MainClass</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-my-jar-with-dependencies</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
その後、コンソールを使ってpom.xmlがあるディレクトリに切り替える必要があります。その後、 mvn Assembly:single を実行する必要があります。その後、依存関係を含む実行可能JARファイルがビルドされます。 cd ./target を使用して出力(ターゲット)ディレクトリに切り替え、 Java -jar mavenproject1-1.0-SNAPSHOT-jar-with-dependenciesのようなコマンドを使用してjarを起動したときに、これをチェックできます.jar .
これを Apache Maven 3.0.3 でテストしました。
私はすべての依存関係を含む太い実行可能なjarファイルを作成しようとしているこれらすべての応答を調べましたが、どれも正しく機能しませんでした。答えはshadeプラグインです。とても簡単で分かりやすいです。
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<executions>
<!-- Run shade goal on package phase -->
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.Apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>path.to.MainClass</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
これが正しく機能するためには、依存関係がコンパイルまたはランタイムの範囲を持つ必要があることに注意してください。
maven-shade-plugin
とmaven-jar-plugin
を組み合わせることができます。
maven-shade-plugin
は、クラスとすべての依存関係を単一のjarファイルにまとめたものです。maven-jar-plugin
を設定します( クラスパスの設定 の「Jarを実行可能にする」の章を参照)。maven-jar-plugin
のPOM構成の例:
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.example.MyMainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
最後に次のコマンドを実行して実行可能jarを作成します。
mvn clean package shade:shade
あなたは以下のような超大瓶を作るためにMaven-shadeプラグインを使うことができます。
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
これはMaven用の実行可能なjarプラグインです。これはCredit Karmaで使用しています。入れ子になったjarからクラスをロードできるクラスローダーを使ってjarのjarファイルを作成します。これにより、devとprodで同じクラスパスを使用しながら、すべてのクラスを単一の署名付きjarファイルに保存することができます。
https://github.com/creditkarma/maven-exec-jar-plugin
そして、ここにプラグインについての詳細と我々がそれを作った理由が記されたブログ記事があります: https://engineering.creditkarma.com/general-engineering/new-executable-jar-plugin-available-Apache-maven/ /
Ken Liuは私の意見ではそれを正しく持っています。 Mavenの依存関係プラグインを使用すると、すべての依存関係を拡張し、それらをリソースとして扱うことができます。これにより、それらを main artifactに含めることができます。 Assemblyプラグインを使用すると、修正が困難な2次成果物が作成されます。私の場合は、カスタムマニフェストエントリを追加したいのです。私のポンポンは次のようになりました。
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack-dependencies</id>
<phase>package</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
...
<resources>
<resource>
<directory>${basedir}/target/dependency</directory>
<targetPath>/</targetPath>
</resource>
</resources>
</build>
...
</project>
それはそのようなはずです:
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack-dependencies</id>
<phase>generate-resources</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
</execution>
</executions>
</plugin>
パッケージ化フェーズの場合は、リソースとして生成されないため、開梱はリソース生成フェーズにする必要があります。きれいなパッケージを試してみるとわかります。
onejar plugin を使用して、すべての依存関係jarをパッケージ化した1つの実行可能jarファイルとして構築します。これで、これと似た私の問題は解決しました。 Assemblyプラグインが使用されたとき、それはすべての依存性jarをソースフォルダに解凍し、それらをjarとして再パッケージ化しました、それは私が私のコードの中に持っていた同じクラス名を持っていたすべての類似の実装onejarはここでは簡単な解決策です。
Maven-Assembly-plugin-2.2.1で共有アセンブリファイルを見つけるのに問題がありますか?
Descriptor/descriptorまたはdescriptorRefs/descriptorRefパラメータの代わりにdescriptorId設定パラメータを使用してみてください。
どちらも必要なことはしません。クラスパスでファイルを探します。もちろん、共有アセンブリがmaven-Assembly-pluginのクラスパスにあるパッケージを追加する必要があります(下記参照)。 Maven 2.x(Maven 3.xではなく)を使用している場合は、pluginManagementセクションの一番上の親pom.xmlにこの依存関係を追加する必要があります。
詳しくは this をご覧ください。
クラス:org.Apache.maven.plugin.Assembly.io.DefaultAssemblyReader
例:
<!-- Use the Assembly plugin to create a Zip file of all our dependencies. -->
<plugin>
<artifactId>maven-Assembly-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<id>make-Assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptorId>Assembly-Zip-for-wid</descriptorId>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>cz.ness.ct.ip.assemblies</groupId>
<artifactId>TEST_SharedAssemblyDescriptor</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
</plugin>
他の人がこれまでに行ったように直接質問に答えることはしませんが、すべての依存関係をプロジェクトのjarファイルに埋め込むのは良い考えかどうか、本当に疑問に思います。
私は要点(展開/使用の容易さ)を見ますが、それはあなたの目的の使用例に依存します(そして代替手段があるかもしれません(下記参照))。
あなたがそれを完全にスタンドアロンで使うなら、なぜそうではないですか。
しかし、プロジェクトを他のコンテキストで使用する場合(Webアプリケーションなど、他のjarファイルが置かれているフォルダにドロップした場合)、クラスパスにjarの複製が含まれる可能性があります(フォルダ内のもの、jar内のもの)。たぶん入札取引ではありませんが、私は通常これを避けます。
良い代替案:
このように、最終的にはマニフェストと "特別な動的クラスローダーメイン"だけで、次のようにしてプロジェクトを開始できます。
Java -jar ProjectMainJar.jar com.stackoverflow.projectName.MainDynamicClassLoaderClass
この問題を解決するために、依存関係JARと一緒にJARを単一の実行可能JARファイルに作成するMavenアセンブリプラグインを使用します。 pom.xmlファイルに以下のプラグイン設定を追加するだけです。
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-Assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.your.package.MainClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-my-jar-with-dependencies</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
これを行った後、このコマンドmvn clean compile Assemblyを使ってMAVENツールを実行することを忘れないでください。Assembly:single
あなたが望むならコマンドライン自体からであれば。プロジェクトパスから以下のコマンドを実行するだけです。
mvn Assembly:assembly
これは私が見つけた最良の方法です:
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.myDomain.etc.MainClassName</mainClass>
<classpathPrefix>dependency-jars/</classpathPrefix>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.5.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>
${project.build.directory}/dependency-jars/
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
この設定では、すべての依存関係は/dependency-jars
に配置されます。私のアプリケーションにはMain
クラスはなく、コンテキストクラスだけがありますが、私の依存関係の1つにはJMXサーバーを起動するMain
クラス(com.myDomain.etc.MainClassName
)があり、start
またはstop
パラメーターを受け取ります。だからこれで私はこのように私のアプリケーションを起動することができました:
Java -jar ./lib/TestApp-1.0-SNAPSHOT.jar start
みなさんに役立つことを待っています。
私のために働いてきた何かがありました:
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<id>unpack-dependencies</id>
<phase>package</phase>
</execution>
</executions>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>SimpleKeyLogger</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
私の依存はシステム1だったので、私は特別なケースを経験しました:
<dependency>
..
<scope>system</scope>
<systemPath>${project.basedir}/lib/myjar.jar</systemPath>
</dependency>
@ user189057が提供するコードを変更して変更しました。1)maven-dependency-pluginが "prepare-package"フェーズで実行されます
また、このプラグインを使用することができます、それはかなり良いですし、私は私のjarファイルをパッケージ化するためにそれを使用します http://sonatype.github.io/jarjar-maven-plugin/
Pom.xmlに追加します。
<dependency>
<groupId>com.jolira</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<version>1.4.4</version>
</dependency>
そして
<plugin>
<groupId>com.jolira</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<version>1.4.4</version>
<executions>
<execution>
<goals>
<goal>one-jar</goal>
</goals>
</execution>
</executions>
</plugin>
それでおしまい。次のmvnパッケージは、すべての依存関係jarを含め、さらに1つのfat jarを作成します。
あなたのアプリケーションにentryPointを追加する必要がなければ、<mainClass>
は必要ないと付け加えたいと思いました。 例えば、APIは必ずしもmain
メソッドを持っているとは限りません。
<build>
<finalName>log-enrichment</finalName>
<plugins>
<plugin>
<artifactId>maven-Assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
mvn clean compile Assembly:single
ll target/
total 35100
drwxrwx--- 1 root vboxsf 4096 Sep 29 16:25 ./
drwxrwx--- 1 root vboxsf 4096 Sep 29 16:25 ../
drwxrwx--- 1 root vboxsf 0 Sep 29 16:08 archive-tmp/
drwxrwx--- 1 root vboxsf 0 Sep 29 16:25 classes/
drwxrwx--- 1 root vboxsf 0 Sep 29 16:25 generated-sources/
drwxrwx--- 1 root vboxsf 0 Sep 29 16:25 generated-test-sources/
-rwxrwx--- 1 root vboxsf 35929841 Sep 29 16:10 log-enrichment-jar-with-dependencies.jar*
drwxrwx--- 1 root vboxsf 0 Sep 29 16:08 maven-status/
私はここで最も投票された答えを試してみました、そしてjarファイルを実行可能にすることができました。しかし、プログラムは正しく実行されませんでした。その理由がわからない。 Eclipse
から実行しようとすると異なる結果になりますが、コマンドラインからjarを実行すると異なる結果になります(プログラム固有のランタイムエラーでクラッシュします)。
私は自分のプロジェクトに(Maven)依存関係が多すぎるという点で、OPと同様の要件を持っていました。幸い、私にとってうまくいった唯一の解決策はEclipse
を使うことでした。とてもシンプルでとても簡単です。これはOPの解決策ではありませんが、同様の要件を持つがMavenの依存関係が多い人のための解決策です。
1)Eclipseのプロジェクトフォルダを右クリックしてExport
を選択してください。
2)それからJava
- > Runnable Jar
を選択します
3)jarファイルの場所を選択するように求められます
4)最後に、実行したいMainメソッドを持つクラスを選択し、Package dependencies with the Jar file
を選択してFinish
をクリックします。
Uber-jarファイルから特定の依存関係を除外するオプションを探している人のために、これは私のために働いた解決策です:
<project...>
<dependencies>
<dependency>
<groupId>org.Apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>1.6.1</version>
<scope>provided</scope> <=============
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-Assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>...</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-Assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
つまり、mvn-Assembly-pluginの設定ではなく、依存関係のプロパティです。
この記事で言及したツリープラグインを比較しました。私は2つのjarファイルとすべてのjarファイルを含むディレクトリを生成しました。私は結果を比較して、間違いなくmaven-shade-pluginが最高です。私の課題は、jax-rsとJDBCサービスの他に、マージする必要がある複数のSpringリソースがあることです。それらはすべてmaven-Assembly-pluginと比較してshadeプラグインによって適切にマージされました。その場合、あなたがそれらをあなた自身のリソースフォルダーにコピーし、そしてそれらを一度手動でマージしない限り、春は失敗するでしょう。両方のプラグインは正しい依存関係ツリーを出力します。私はテスト、提供、コンパイルなどテストのような複数のスコープを持っていて、提供されたものは両方のプラグインによってスキップされました。両方とも同じマニフェストを生成しましたが、私はそれらのトランスフォーマーを使用してライセンスをshadeプラグインと統合することができました。もちろんmaven-dependency-pluginを使えば、jarファイルは抽出されないので、これらの問題はありません。しかし、他の人が指摘したように、正しく動作させるには1つの追加ファイルを用意する必要があります。これがpom.xmlの断片です。
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<includeScope>compile</includeScope>
<excludeTransitive>true</excludeTransitive>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-Assembly-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.rbccm.itf.cdd.poller.landingzone.LandingZonePoller</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-my-jar-with-dependencies</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<configuration>
<shadedArtifactAttached>false</shadedArtifactAttached>
<keepDependenciesWithProvidedScope>false</keepDependenciesWithProvidedScope>
<transformers>
<transformer implementation="org.Apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/services/javax.ws.rs.ext.Providers</resource>
</transformer>
<transformer implementation="org.Apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.factories</resource>
</transformer>
<transformer implementation="org.Apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer implementation="org.Apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
<transformer implementation="org.Apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.tooling</resource>
</transformer>
<transformer implementation="org.Apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
<transformer implementation="org.Apache.maven.plugins.shade.resource.ManifestResourceTransformer"/>
<transformer implementation="org.Apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer">
</transformer>
</transformers>
</configuration>
<executions>
<execution>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
Maven-Assembly-pluginは私にとってとてもうまくいった。私はmaven-dependency-pluginを何時間も費やしましたが、動かせませんでした。主な理由は、 documentation に記述されているとおりに含めるべきアーティファクト項目を設定セクションで明示的に定義しなければならなかったことです。あなたがそれを使いたい場合のためにそこに例があります:mvn dependency:copy
、そこにはどんなartifactItemsも含まれていませんが、それは動作しません。
これもオプションかもしれません、あなたはあなたのjarファイルを構築することができるでしょう
<build>
<plugins>
<plugin>
<!-- Build an executable JAR -->
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>WordListDriver</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
<build>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-Assembly-plugin</artifactId>
<version>2.4.1</version>
<configuration>
<!-- get all project dependencies -->
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-Assembly</id>
<!-- bind to the packaging phase -->
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
このブログ記事は、maven-jarとmaven-Assemblyプラグインを組み合わせた別のアプローチを示しています。ブログ投稿のAssembly configuration xmlを使用して、依存関係を拡張するか、単にフォルダに集めてマニフェストのクラスパスエントリで参照するかを制御することもできます。
理想的な解決策は、jarファイルをlibフォルダに含め、メインjarファイルのmanifest.mfファイルにすべてのjarファイルをクラスパスに含めることです。
そして、まさにそれがここに説明されています: https://caffebig.wordpress.com/2013/04/05/executable-jar-file-with-dependent-jars-using-maven/