8

Maven アセンブリ プラグインを使用して、マルチモジュール プロジェクトのアセンブリを作成します。このマルチモジュール プロジェクトからビルドされた 2 つの個別のアプリケーションがあり、それぞれに個別の依存関係があります。モジュール ビルドとそれぞれの依存関係を使用して (アプリケーションごとに) 2 つのディレクトリをアセンブルするカスタム アセンブリ記述子を作成しました。それはすべてうまくいきますが、1 つのこと - 両方のモジュールの依存関係を互いのアセンブリに置きます。

以下は、まったく同じ動作をする私のプロジェクトの簡略化されたバージョンです。

2 つのモジュールと 1 つのアセンブリ モジュールで構成されるプロジェクトを考えてみましょう。

APP
  module1
  module2
  assembly

純粋にデモンストレーションのために依存関係を追加しました。

com.test.app:module1:jar:1.0
\- commons-cli:commons-cli:jar:1.2:compile

com.test.app:module2:jar:1.0
\- commons-daemon:commons-daemon:jar:1.0.8:compile

親POMは次のとおりです。

<project>
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.test</groupId>
  <artifactId>app</artifactId>
  <version>1.0</version>
  <packaging>pom</packaging>

  <modules>
    <module>module1</module>
    <module>module2</module>
    <module>assembly</module>
  </modules>
</project>

モジュール 1 POM:

<project>
  <parent>
    <groupId>com.test</groupId>
    <artifactId>app</artifactId>
    <version>1.0</version>
  </parent>

  <modelVersion>4.0.0</modelVersion>

  <groupId>com.test.app</groupId>
  <artifactId>module1</artifactId>
  <version>1.0</version>
  <packaging>jar</packaging>

  <dependencies>
    <dependency>
      <groupId>commons-cli</groupId>
      <artifactId>commons-cli</artifactId>
      <version>1.2</version>
    </dependency>
  </dependencies>
</project>

モジュール 2 POM:

<project>
  <parent>
    <groupId>com.test</groupId>
    <artifactId>app</artifactId>
    <version>1.0</version>
  </parent>

  <modelVersion>4.0.0</modelVersion>

  <groupId>com.test.app</groupId>
  <artifactId>module2</artifactId>
  <version>1.0</version>
  <packaging>jar</packaging>

  <dependencies>
    <dependency>
      <groupId>commons-daemon</groupId>
      <artifactId>commons-daemon</artifactId>
      <version>1.0.8</version>
    </dependency>
  </dependencies>
</project>

アセンブリ POM:

<project>
  <parent>
    <groupId>com.test</groupId>
    <artifactId>app</artifactId>
    <version>1.0</version>
  </parent>

  <modelVersion>4.0.0</modelVersion>

  <groupId>com.test.app</groupId>
  <artifactId>assembly</artifactId>
  <version>1.0</version>
  <packaging>pom</packaging>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.2.2</version>

        <executions>
          <execution>
            <id>make-assembly</id>
            <phase>package</phase>

            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>

        <configuration>
          <appendAssemblyId>false</appendAssemblyId>

          <descriptors>
            <descriptor>src/main/assembly/descriptor.xml</descriptor>
          </descriptors>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

最後に、アセンブリ記述子:

<assembly>
  <id>distribution</id>
  <includeBaseDirectory>false</includeBaseDirectory>

  <formats>
    <format>dir</format>
  </formats>

  <moduleSets>
    <moduleSet>
      <useAllReactorProjects>true</useAllReactorProjects>

      <includes>
        <include>com.test.app:module1:jar</include>
      </includes>

      <binaries>
        <outputDirectory>module1</outputDirectory>
        <unpack>false</unpack>

        <dependencySets>
          <dependencySet>
            <unpack>false</unpack>
          </dependencySet>
        </dependencySets>
      </binaries>
    </moduleSet>

    <moduleSet>
      <useAllReactorProjects>true</useAllReactorProjects>

      <includes>
        <include>com.test.app:module2:jar</include>
      </includes>

      <binaries>
        <outputDirectory>module2</outputDirectory>
        <unpack>false</unpack>

        <dependencySets>
          <dependencySet>
            <unpack>false</unpack>
          </dependencySet>
        </dependencySets>
      </binaries>
    </moduleSet>
  </moduleSets>
</assembly>

ご覧のとおり、アセンブリはパッケージ フェーズにバインドされます。だから、私が実行すると

mvn package

親ディレクトリから、次のアセンブリがあります

module1/
  commons-cli-1.2.jar
  commons-daemon-1.0.8.jar
  module1-1.0.jar
module2/
  commons-cli-1.2.jar
  commons-daemon-1.0.8.jar
  module2-1.0.jar

基本的に、ここでの問題は、module1 が commons-daemon に依存していないことですが、アセンブリ プラグインには依存関係が含まれています。同様に、module2 と commons-cli を使用します。

アセンブリプラグインがこのように動作する理由を誰かが説明できますか?

解決策は何ですか?

4

1 に答える 1

10

私は常に、マルチモジュールプロジェクトでアセンブリプラグインを使用して同様の経験をしましたが、最終結果は私が期待したものではありませんでした。他の誰かが、なぜそれが起こっているのか、そしてこれら2つの概念を組み合わせて使用​​するのに最適な方法についてより正確な答えを提供できることを願っています。

とはいえ、考えられる回避策は、module1とmodule2に、それぞれのjarと依存関係を含む独自のアセンブリアーティファクトを生成させることです。次に、アセンブリサブモジュールのpomファイルを変更して、兄弟モジュールから生成された配布アーティファクトに依存するようにしてから、それらを新しいアセンブリに解凍します。

Module1とModule2の両方のpomファイルで、アセンブリサブモジュールで行ったのと同じように、アセンブリプラグイン構成をパッケージフェーズに追加できます。

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.2.2</version>

        <executions>
          <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>

        <configuration>
          <descriptors>
            <descriptor>src/main/assembly/descriptor.xml</descriptor>
          </descriptors>
        </configuration>
      </plugin>
    </plugins>
  </build>

Module1には、次のようなsrc / main / assembly/descriptor.xmlがあります。

<assembly>
  <id>distribution</id>
  <includeBaseDirectory>false</includeBaseDirectory>

  <formats>
    <format>zip</format>
  </formats>

  <dependencySets>
    <dependencySet>
      <outputDirectory>module1</outputDirectory>
      <unpack>false</unpack>
    </dependencySet>
  </dependencySets>
</assembly>

また、Module2には同様のsrc / main / assembly/descriptor.xmlがあります

<assembly>
  <id>distribution</id>
  <includeBaseDirectory>false</includeBaseDirectory>

  <formats>
    <format>zip</format>
  </formats>

  <dependencySets>
    <dependencySet>
      <outputDirectory>module2</outputDirectory>
      <unpack>false</unpack>
    </dependencySet>
  </dependencySets>
</assembly>

次に、assembly / pom.xmlで、モジュール1および2のzipアーティファクトを依存関係として追加します。

  <dependencies>
    <dependency>
      <groupId>com.test.app</groupId>
      <artifactId>module1</artifactId>
      <version>1.0</version>
      <type>zip</type>
      <classifier>distribution</classifier>
    </dependency>
    <dependency>
      <groupId>com.test.app</groupId>
      <artifactId>module2</artifactId>
      <version>1.0</version>
      <type>zip</type>
      <classifier>distribution</classifier>
    </dependency>
  </dependencies>

...そして、assembly / src / main / assembly/descriptor.xmlファイルを次のようにトリミングします

<assembly>
  <id>distribution</id>
  <includeBaseDirectory>false</includeBaseDirectory>

  <formats>
    <format>dir</format>
  </formats>

  <dependencySets>
    <dependencySet>
      <useTransitiveDependencies>false</useTransitiveDependencies>
      <unpack>true</unpack>
    </dependencySet>
  </dependencySets>

</assembly>

私が言ったように、これは1つの可能な回避策であり、残念ながら、ビルドプロセスにかなりの量の追加のXML構成を追加します。しかし、それは機能します。

于 2012-01-27T20:02:07.107 に答える