配布用にプロジェクトを単一の実行可能JARにパッケージ化したい。
Mavenプロジェクトパッケージをすべての依存関係JARを出力JARに作成するにはどうすればよいですか?
配布用にプロジェクトを単一の実行可能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>
mvn clean compile assembly:single
。
<appendAssemblyId>false</appendAssemblyId>
をに追加configuration
して、名前の迷惑な「-jar-with-dependencies」サフィックスを回避することもできます
compile
、あなたはねじ込まれています。
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をロードするカスタムクラスローディングコードを追加する必要があります。
${project.build.directory}/classes/lib
ように使用outputDirectory
しますが、このjarをロードするカスタムクラスロードコードを追加するにはどうすればよいですか。次のような作業を実行する必要がありますjava -jar main-jar-with-deps.jar
。これは可能ですか?
これを行ういくつかの異なる方法についてブログを書いた。
Apache Maven(WordPress)で実行可能なJARを参照してください。
または実行可能なjar-with-maven-example(GitHub)
これらの長所と短所は、ステファンによって提供されます。
<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
ます。
Unansweredの回答を取り入れて再フォーマットすると、次のようになります。
<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
ライフサイクルイベントにバインドします。ただし、問題assembly:single
は、pom.xmlに配置する場合は目標を呼び出す必要があることですが、コマンドラインから手動で実行する場合は「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
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>
maven-shadeプラグインを使用して、以下のようなuber jarを構築できます
<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>
結果の単一のJAR内に他のJARコンテンツを再パッケージ化する場合のもう1つのオプションは、Mavenアセンブリプラグインです。を使用して、すべてを解凍してからディレクトリに再パックします<unpack>true</unpack>
。次に、それを1つの巨大なJARに構築する2番目のパスがあります。
別のオプションは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を使用して出力(ターゲット)ディレクトリーに切り替え、jarをjava -jar mavenproject1-1.0-SNAPSHOT-jar-with-dependencies.jarに類似したコマンドで開始するときに確認できます。
これをApache Maven 3.0.3でテストしました。
すべての依存関係を含む太い実行可能jarを作成するために、これらのすべての応答を調べましたが、どれも正しく機能しませんでした。答えは、シェードプラグインで、非常に簡単でわかりやすいものです。
<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>
これが正しく機能するには、依存関係にコンパイルまたはランタイムのスコープが必要であることに注意してください。
plugin
要素はに行くpom.xml
の下でbuild/plugins
。
あなたは組み合わせることができmaven-shade-plugin
とmaven-jar-plugin
。
maven-shade-plugin
単一のJARファイルにあなたのクラスとすべての依存関係をパックします。maven-jar-plugin
実行可能jarのメインクラスを指定するようにを構成します(「クラスパスの設定」の章「Jarを実行可能にする」を参照)。のPOM構成の例maven-jar-plugin
:
<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依存関係プラグインを使用すると、すべての依存関係を拡張して、リソースとして扱うことができます。これにより、それらをメインアーティファクトに含めることができます。アセンブリプラグインを使用すると、変更が難しい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>
パッケージ化フェーズの場合、リソースとして含まれないため、アンパックはリソース生成フェーズで行う必要があります。クリーンなパッケージを試してみてください。
maven-assembly-plugin-2.2.1で共有アセンブリファイルを検索する際の問題?
descriptors / descriptorまたはdescriptorRefs / descriptorRefパラメータの代わりにdescriptorId設定パラメータを使用してみてください。
どちらも必要なことを行いません。クラスパスでファイルを探します。もちろん、共有アセンブリが存在するパッケージをmaven-assembly-pluginのクラスパスに追加する必要があります(以下を参照)。Maven 3.xではなくMaven 2.xを使用している場合は、pluginManagementセクションの最上位の親pom.xmlにこの依存関係を追加する必要がある場合があります。
詳細はこちらをご覧ください。
クラス: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と一緒に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>
これを行った後、このコマンドでMAVENツールを実行することを忘れないでくださいmvn clean compile assembly:single
他の人が以前にそれを行ったので、私は直接質問に答えませんが、プロジェクトのjar自体にすべての依存関係を埋め込むのは良い考えだと思います。
私は要点はわかります(展開/使用の容易さ)が、それはあなたのプロジェクトのユースケースに依存します(そして代替案があるかもしれません(下記参照))。
完全にスタンドアロンで使用するのであれば、なぜでしょうか。
しかし、プロジェクトを他のコンテキスト(Webアプリケーションなど、または他のjarが置かれているフォルダーにドロップ)で使用する場合、クラスパス(フォルダー内のもの、jar内のもの)にjarの重複がある可能性があります。多分入札取引ではないかもしれませんが、私は通常これを避けます。
良い選択肢:
このように、最終的にはマニフェストと「特別な動的クラスローダーメイン」だけで、プロジェクトを次のように開始できます。
java -jar ProjectMainJar.jar com.stackoverflow.projectName.MainDynamicClassLoaderClass
コマンドライン自体から実行可能JARを作成するには、プロジェクトパスから次のコマンドを実行します。
mvn assembly:assembly
pom.xml
そうあなたが得ますError reading assemblies: No assembly descriptors found.
。とにかくそれが私に起こります。
これは私が見つけた最良の方法です:
<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
皆様のお役に立てれば幸いです。
この投稿で述べたツリープラグインを比較しました。2つのjarファイルと、すべてのjarファイルを含むディレクトリを生成しました。結果を比較したところ、間違いなくmaven-shade-pluginが最高です。私の課題は、マージする必要がある複数のSpringリソース、jax-rs、およびJDBCサービスがあることです。これらはすべて、maven-assembly-pluginと比較して、shadeプラグインによって適切にマージされました。その場合、独自のリソースフォルダーにコピーして手動で一度マージしない限り、Springは失敗します。どちらのプラグインも正しい依存関係ツリーを出力します。テスト、提供、コンパイルなどの複数のスコープがあり、テストと提供が両方のプラグインによってスキップされました。どちらも同じマニフェストを生成しましたが、トランスフォーマーを使用して、シェードプラグインでライセンスを統合できました。もちろん、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>
私にとってうまくいったことは:
<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」フェーズで実行されます2)解凍されたクラスを「target / classes」に直接抽出しています
私はここで最も投票された回答を試しましたが、jarを実行可能にすることができました。しかし、プログラムは正しく実行されませんでした。その理由はわかりません。から実行しようとするとEclipse
、異なる結果が得られますが、jarをコマンドラインから実行すると、異なる結果が得られます(プログラム固有のランタイムエラーでクラッシュします)。
OPと同様の要件がありましたが、プロジェクトに対して(Maven)依存関係が多すぎるということです。幸い、私にとって有効な唯一の解決策は、を使用することEclipse
でした。とてもシンプルで簡単です。これはOPの解決策ではありませんが、同様の要件を持っているが多くのMaven依存関係がある人のための解決策です。
1)Eclipse内のプロジェクトフォルダーを右クリックして、 Export
2)次に選択Java
->Runnable Jar
3)jarファイルの場所を選択するように求められます
4)最後に、あなたが実行して選択したいことを主なメソッドを持つクラスを選択Package dependencies with the Jar file
し、クリックしてくださいFinish
これもオプションになる可能性があります。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>
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の構成ではなく、依存関係のプロパティです。
すでに何百万もの回答があり<mainClass>
ます。アプリケーションにentryPointを追加する必要がない場合は、不要なものを追加したいと思います。たとえば、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/
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つのファットjarを追加で作成します。
このブログ投稿は、maven-jarプラグインとmaven-assemblyプラグインを組み合わせる別のアプローチを示しています。ブログ投稿のアセンブリ構成xmlを使用すると、依存関係が展開されるか、フォルダに収集され、マニフェストのクラスパスエントリによって参照されるかどうかも制御できます。
理想的なソリューションは、jarをlibフォルダーに含め、メインjarのmanifest.mfファイルにすべてのjarをクラスパスに含めることです。
そして、それはここで説明されています:https : //caffebig.wordpress.com/2013/04/05/executable-jar-file-with-dependent-jars-using-maven/
<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>
さて、これが私の解決策です。pom.xmlファイルを使用していないことはわかっています。しかし、プログラムをNetbeansでコンパイルおよび実行するときに問題が発生しましたが、Java -jar MyJarFile.jarを試行すると失敗しました。今、私はMavenを完全には理解していません。これが、Netbeans 8.0.2がjarファイルをライブラリに含めてjarファイルに入れるのに問題があった理由だと思います。EclipseでMavenを使用せずにjarファイルを使用する方法について考えていました。
すべての依存関係とプラグインをコンパイルできるのはMavenです。Netbeansではありません。(Netbeansを入手でき、java .jarを使用してこれを実行できる場合は、方法を教えてください(^。^)v)
[解決済み-Linuxの場合]端末を開く。
その後
cd /MyRootDirectoryForMyProject
次
mvn org.apache.maven.plugins:maven-compiler-plugin:compile
次
mvn install
これにより、ターゲットディレクトリにjarファイルが作成されます。
MyJarFile-1.0-jar-with-dependencies.jar
今
cd target
(実行する必要があるかもしれません: chmod +x MyJarFile-1.0-jar-with-dependencies.jar
)
そして最後に
java -jar MyJarFile-1.0-jar-with-dependencies.jar
参照してください
https://cwiki.apache.org/confluence/display/MAVEN/LifecyclePhaseNotFoundException
この解決策は、同様の問題がある他のいくつかのページに投稿します。うまくいけば、1週間の不満から誰かを救うことができます。