11

Maven で 2 つの異なるバージョンの WAR をビルドしたいと思います (それはダメだということはわかっています。それは現在の状況に応じた方法です)。アセンブリによって表される WAR のバージョンで、依存関係を同じ依存関係で別の分類子に置き換えたいと考えています。たとえば、次のアセンブリが機能することを期待していました。

<assembly>
  <id>end-user</id>
  <formats>
    <format>war</format>
  </formats>
  <dependencySets>
    <dependencySet>
      <excludes>
        <exclude>group:artifact:jar:${project.version}</exclude>
      </excludes>
      <includes>
        <include>group:artifact:jar:${project.version}:end-user</include>
      </includes>
    </dependencySet>
  </dependencySets>
</assembly>

これは機能しませんが、正しい方向に向かっていますか? Maven アセンブリ ページのすべてのページと、関連すると思われるMaven Definitive Guideのセクションを既に読みました。どんなポインタも役に立ちます。

4

2 に答える 2

8

個人的には、最もクリーンな解決策は 2 つのプロファイルを使用することだと思います (1 つは分類器を使用したアーティファクトに依存し、もう 1 つは「通常の」アーティファクトに依存します)。しかし、カスタム アセンブリを使用すると、実際に目的を達成できます。ただ、あなたが正しい方向に向かっているとは思えません。これが私がそれを行う方法です...

最初に、アセンブリ用の特定のプロジェクトを作成し、依存関係として分類子を使用して webapp と成果物の両方を宣言します。このようなもの:

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>artifact</artifactId>
      <version>${project.version}</version>
      <classifier>end-user<classifier>
    </dependency>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>zewebapp</artifactId>
      <version>${project.version}</version>
      <type>war</type>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.2-beta-5</version>
        <configuration>
          <descriptors>
            <descriptor>src/main/assembly/end-user.xml</descriptor>
          </descriptors>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id>
            <!-- this is used for inheritance merges -->
            <phase>package</phase>
            <!-- append to the packaging phase. -->
            <goals>
              <goal>single</goal>
              <!-- goals == mojos -->
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

次に、アセンブリ記述子で次のようにします。

<assembly>
  <id>end-user</id>
  <formats>
    <format>war</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <unpack>true</unpack>
      <unpackOptions>
        <excludes>
          <exclude>**/artifact-*.jar</exclude>
        </excludes>
      </unpackOptions>
      <includes>
        <include>*:war</include>
      </includes>
    </dependencySet>
    <dependencySet>
      <unpack>false</unpack>
      <outputDirectory>WEB-INF/lib</outputDirectory>
      <includes>
        <include>group:artifact:jar:*:end-user</include>
      </includes>
    </dependencySet>    
  </dependencySets>
</assembly>

基本的に、これはアセンブリ プラグインに war を取得して展開するように指示しますzewebappが、展開中に不要なアーティファクトを除外するように指示します。次に、アセンブリ プラグインが分類子を使用してアーティファクトを取得し、配置しますWEB-INF/lib(そのため、元のものに置き換えます)。最後に、すべてが戦争としてパッケージ化されます。

簡単な例でこれをテストしましたが、うまくいくはずです。

于 2010-04-23T05:15:11.177 に答える
4

includes/include* のアーティファクト座標を指定する場合、「バージョン」情報は必要ありません。

これはうまくいくはずです:

<assembly>
  <id>end-user</id>
  <formats>
    <format>war</format>
  </formats>
  <dependencySets>
    <dependencySet>
      <includes>
        <include>group:artifact:jar:end-user</include>
      </includes>
    </dependencySet>
  </dependencySets>
</assembly>

includes/include* セクションのMaven アセンブリ ドキュメントが正しくないと思います。「アーティファクトの座標は、単純な groupId:artifactId 形式で指定するか、groupId:artifactId:type:version[:classifier] の形式で完全修飾することができます」と書かれています。ただし、私のテストでは、「バージョン」は必要ありません。ここからヒントを得ました。

見つけるのに時間がかかりましたが、将来他の人に役立つかもしれないと考えました。

于 2011-09-28T06:59:00.300 に答える