web-dev-qa-db-ja.com

Mavenを使用して依存関係のない実行可能jarを作成するにはどうすればよいですか?

配布用の単一の実行可能jarにパッケージ化したくない。 main.jarのような実行可能ファイルと、libs/*。jarにあるすべての依存関係が必要です。

依存関係ライブラリに事前に含まれていないmaven実行可能jarを作成するにはどうすればよいですか?

Mavenを使用して依存関係のある実行可能JARを作成するにはどうすればよいですか? 2010年12月1日10:46にAndréAronsenと回答したメモがありますが、それは単に機能しません(sadescriptorRefの失敗は設定されていません)。

18
Bogdan

これはある程度達成できます。

まず、 maven jarプラグイン を適切に構成して 実行可能jar を作成します。

次に、maven Assemblyプラグインを使用して、依存関係のあるjarを作成しますプロジェクトjarを除く。これを行うには、記述子ファイルを作成します。たとえば、src/main/Assembly/descriptor.xml、 このような。

<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>jar-with-dependencies</id>
  <formats>
    <format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <outputDirectory>/</outputDirectory>
      <useProjectArtifact>false</useProjectArtifact>
      <unpack>true</unpack>
      <scope>runtime</scope>
    </dependencySet>
  </dependencySets>
</Assembly>

このようにプロジェクトで使用してください。

<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <artifactId>maven-Assembly-plugin</artifactId>
        <version>2.2.1</version>
        <configuration>
          <descriptors>
            <descriptor>src/main/Assembly/descriptor.xml</descriptor>
          </descriptors>
        </configuration>
        [...]
      </plugin>
    </plugins>
  </build>
</project>

最終的に2つのjarを取得します。1つはプロジェクトによって作成された実行可能jarで、もう1つはAssemblyプラグインによって作成された依存関係のあるjarです。

11
Raghuram

私はこれを少し修正したソリューションを好みます。クラスパスを設定して実行可能jarを作成し、すべての依存関係を指定されたディレクトリにコピーします。

追加のファイルは必要ありません。

依存関係はインストールフェーズ中にコピーされます。

<build>
    <plugins>
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <mainClass>fully.qualified.MainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <phase>install</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        <!-- optional -->
                        <!-- exclude copying test and provided dependencies -->
                        <includeScope>runtime</includeScope>
                        <excludeScope>provided</excludeScope>
                        <!-- optional -->
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

説明されているように、ランタイム依存関係のみをコピーするように回答を更新しました ここでは-正しい依存関係をコピーします 。テストおよび提供された依存関係は除外されます。

テストスコープと提供されたスコープの両方から依存関係を除外する場合は、提供されたスコープを除外し、ランタイムスコープを含める必要があることがわかりました。

13