web-dev-qa-db-ja.com

マルチモジュールmavenプロジェクトでMavenアセンブリプラグインを使用する方法

私はmavenに不慣れであり、 を参照するアセンブリプラグインを使用してZipファイルを生成するのに3日ほど費やしました-binary-distribution-with-maven-Assembly-plugin / プロジェクトはマルチモジュールであるため、 Maven Assemblyプラグインを使用したマルチモジュール依存関係の管理 も参照しました

それでも私はいくつかの非効率があります。以下はAssembly.xmlです(私は最初のリンクから継承しました)

 <Assembly>
<id>bin</id>
<!-- Generates a Zip package containing the needed files -->
<formats>
    <format>Zip</format>
</formats>

<!-- Adds dependencies to Zip package under lib directory -->
<dependencySets>
    <dependencySet>
        <!-- Project artifact is not copied under library directory since it is 
            added to the root directory of the Zip package. -->
        <useProjectArtifact>false</useProjectArtifact>
        <outputDirectory>lib</outputDirectory>
        <unpack>false</unpack>

    </dependencySet>
</dependencySets>
<moduleSets>
    <moduleSet>

        <!-- Enable access to all projects in the current multimodule build! <useAllReactorProjects>true</useAllReactorProjects> -->

        <!-- Now, select which projects to include in this module-set. -->
        <includes>
            <include>com.XX:YY-main</include>
        </includes>

        <!--<binaries> <outputDirectory>YY-main/target</outputDirectory> <unpack>false</unpack> 
            </binaries> -->
    </moduleSet>
</moduleSets>
<fileSets>
    <!-- Adds startup scripts to the root directory of Zip package. The startup 
        scripts are located to src/main/scripts directory as stated by Maven conventions. -->
    <fileSet>
        <directory>${project.build.scriptSourceDirectory}</directory>
        <outputDirectory>conf</outputDirectory>
        <includes>
            <include>*</include>
        </includes>
    </fileSet>
    <fileSet>
        <directory>${project.build.directory}</directory>
        <outputDirectory></outputDirectory>
        <includes>
            <include>log4j.properties</include>
        </includes>
    </fileSet>
    <!-- adds jar package to the root directory of Zip package -->
    <fileSet>
        <directory>${project.build.directory}</directory>
        <outputDirectory></outputDirectory>
        <includes>
            <include>*with-dependencies.jar</include>
        </includes>
    </fileSet>
</fileSets>

以下はpom.xml(プライマリまたはメイン)です

 <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-Assembly-plugin</artifactId>
            <version>2.4</version>
             <configuration>                    <descriptors>
              <descriptor>YY-main/src/main/Assembly/assembly.xml</descriptor>   
         <!-- <descriptor>DummyAssembly.xml</descriptor> -->

                </descriptors>
            </configuration>
        </plugin>   

質問:

1)Assembly.xmlはプライマリpomで参照されるため、すべてのサブモジュールも圧縮されます。圧縮する特定のサブモジュールのみを指定して、他のすべてのモジュールを無視する方法を教えてください。 YY-main/src/main/Assembly/assembly.xmlをメインpomから子/サブモジュールpomに移動しようとしましたが、メインにダミーアセンブリ.xmlがあり、何もしません。しかし、それは機能していません(dummyassembly.xmlに必要な行が欠落している可能性があります)。いくつかのことを試しましたが、何もうまくいかないようです

2)Assembly.xml(dependencyset)でも、すべてのライブラリを「lib」フォルダにコピーしています。どうすればこれを回避できますか。もう一度私は http://maven.Apache.org/plugins/maven-Assembly-plugin/Assembly.html#class_dependencySet に基づいていくつかのこと(除外...)を試しましたが、何もうまくいきませんでした。

私のpomまたはアセンブリファイルで1と2に対応するために変更する必要がある特定のステートメントを提供できる人がいますか?

14
kashili kashili

変更する必要のある基本的なことは、次のようなパッケージングを行う別のモジュールを作成することです。

   +-- root (pom.xml)
        +--- mod-1 (pom.xml)
        +--- mod-2 (pom.xml)
        +--- mod-Assembly (pom.xml)

mod-Assemblyのpomは次のようになります。

<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>org.test.parent</groupId>
    <artifactId>root</artifactId>
    <version>1.0.0-SNAPSHOT</version>
  </parent>

  <artifactId>dist</artifactId>
  <packaging>pom</packaging>

  <name>Packaging Test : Distribution</name>

  <dependencies>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>module-one</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>module-two</artifactId>
      <version>${project.version}</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-Assembly-plugin</artifactId>
        <executions>
          <execution>
            <id>make-bundles</id>
            <goals>
              <goal>single</goal>
            </goals>
            <phase>package</phase>
            <configuration>
              <descriptors>
                <descriptor>proj1-Assembly.xml</descriptor>
              </descriptors>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

</project>

これにより、すべての子でmaven-Assembly-pluginを実行する場合の問題と、ダミー記述子の問題が解決されます。 ここで実際のものが見つかります このような構造の例。

さらに、モジュールを1つのフォルダーに置き、依存関係を別のフォルダーに入れると、 このようなアセンブリ記述子 を使用できます。

  <id>bin</id>
  <formats>
    <format>Zip</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
          <useProjectArtifact>false</useProjectArtifact>
          <useTransitiveDependencies>true</useTransitiveDependencies>
          <outputDirectory>lib</outputDirectory>
          <unpack>false</unpack>
          <excludes>
            <exclude>${project.groupId}:*:*</exclude>
          </excludes>
      </dependencySet>
  </dependencySets>
  <moduleSets>
    <moduleSet>
      <useAllReactorProjects>true</useAllReactorProjects>
      <binaries>
        <outputDirectory>modules</outputDirectory>
        <unpack>false</unpack>
      </binaries>
    </moduleSet>
  </moduleSets>
23
khmarbaise

投稿 Mavenでマルチモジュールプロジェクトをアセンブルする方法 は、例を挙げて質問に答えるかもしれません。

あなたの質問に対する私の答え:

1)アセンブリプラグインをbuildおよびpluginManagementタグ内の親pomに追加して、モジュールで再利用する必要があります。上記の投稿は、その方法の良い例です。オンラインブック「Maven:The Complete Reference」の 8.6ベストプラクティス の章、トピック8.6.2もご覧ください。

2)exclusionタグは扱いにくいかもしれません。もう一度、オンラインブック「Maven:The Complete Reference」の 8.5アセンブリの内容の制御 の章をご覧ください。たとえば、サブトピック8.5.4のdependencySetsについては、dependencySetsの依存関係の包含と除外を微調整する方法について説明しています。繰り返しになりますが、サブトピック8.5.5はmoduleSetsになり、そのコンテキストでの使用方法を示しています。

3
Alexandre