53

現在 Maven に変換中の Ant ビルドがあります。ただし、Ant ビルドには 2 つのビルド ターゲットがあります。1 つはアプリ全体をビルドするターゲットで、もう 1 つはそれらのファイルの一部 (ごく一部) から JAR をビルドするターゲットです。Ant では、複数のビルド ターゲットを使用してこれを処理するのは簡単ですが、Maven でこれを処理する最善の方法を決定しようとしています。

ファイルのサブセットを 2 番目のプロジェクトに分割すると、独自の POM が作成されます。次に、最初のプロジェクトはこれに依存する可能性があります。ただし、ファイルのサブセットが非常に小さい (10 未満) ため、そのためにまったく新しいプロジェクトを用意するのはやり過ぎのように思えます。

これを処理する他の方法はありますか?

4

3 に答える 3

78

プロファイルでこれを行うことができます...

本当に 2 つの個別のプロファイルを使用し、JAR プラグインをカスタマイズして、クラス名とパッケージ名のパターンを含めたり除外したりしたい場合は、POM に次のようなものを入れることで簡単に実行できます。

<profiles>
  <profile>
    <id>everything</id>
    <build>
      <plugins>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <configuration>
            <classifier>everything</classifier>
            <includes>
              <include>**/*</include>
            </includes>
          </configuration>
        </plugin>
      </plugins>
    </build>
  </profile>
  <profile>
    <id>only-library</id>
    <build>
      <plugins>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <configuration>
            <classifier>only-library</classifier>
            <excludes>
              <exclude>**/Main*</exclude>
            </excludes>
          </configuration>
        </plugin>
      </plugins>
    </build>
  </profile>
</profiles>

余談ですが、設定が大変だと思われる方のために、ポリグロット Maven の Groovy POM のサポートはほぼ準備が整っています。これにより、ラインカウントが大幅に削減されます。

これを pom.xml の最後 (project 要素内) に配置すると、2 つのプロファイルが追加されます。最初のプロファイル「everything」は、構成を示すためのものです。この「すべて」のプロファイルは、デフォルトの JAR プラグイン jar ゴール実行の動作を単純に複製するため、不要です。2 番目のプロファイル「only-library」は、テキスト「Main」で始まるすべてのパッケージ内のすべてのクラスを除外します。これらのプロファイルを呼び出すには:

mvn package -Peverything
mvn package -Ponly-library

Maven by Example の第 6 章に同梱されているサンプル アプリケーションに対してこれをテストしました。これらのコマンドのいずれかを実行すると、分類子を持つ ${basedir}/target に JAR ファイルが生成されます。JAR プラグインの jar ゴールはデフォルトの Maven ライフサイクルのパッケージ フェーズにバインドされているため、これら 2 つのプロファイルはこのプラグインの構成を変更します。

または、2 つの JAR プラグインを実行してこれを行うこともできます...

プロファイルを使用せずに 2 つの JAR を作成する必要がある場合。JAR プラグインの jar ゴールをパッケージ ライフサイクル フェーズに複数回バインドし、構成された実行ごとに異なる構成を使用できます。2 つの個別の実行を構成する場合、各実行には実行固有の構成ブロックがあるため、実行ごとに一意の識別子と包含/除外パターンを指定できます。

以下は、両方のカスタム JAR をライフサイクル フェーズの「パッケージ」に追加するために使用するビルド要素です。パッケージ化された「jar」を含むプロジェクトでこれを行うと、jar ゴールが 3 回実行されることになります。1 回はデフォルトのライフサイクル バインディングとして、次に 2 つのカスタムの分類された JAR 用に 2 回。

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <executions>
          <execution>
            <id>only-library</id>
            <goals><goal>jar</goal></goals>
            <phase>package</phase>
            <configuration>
              <classifier>only-library</classifier>
              <excludes>
                <exclude>**/Main*</exclude>
              </excludes>
            </configuration>
          </execution>
          <execution>
            <id>everything</id>
            <goals><goal>jar</goal></goals>
            <phase>package</phase>
            <configuration>
              <classifier>everything</classifier>
              <includes>
                <include>**/*</include>
              </includes>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

各成果物に異なるクラスのセットを含めることについて話していない場合は、Maven アセンブリを使用することをお勧めします。アセンブリの詳細を知りたい場合は、Maven: The Complete Reference からのこの回答の最後にリストされている章があります。率直に言って、私はこの特定の章が良い入門書だとは思いません。実際、私はこの章がほとんど読めないという報告を数多く受けています (そして、私たちはそれを修正するために取り組んでいます)。アセンブリの使用を検討している場合は、Maven Assembly Plugin のドキュメントをお勧めします。左側のナビゲーション メニューに、サンプル アセンブリ記述子のリストが表示されます。

免責事項:(お願い)これをしないでください。2 つの異なるクラス セットを持つ 2 つの異なる JAR を作成する場合は、プロジェクトを 2 つの相互依存モジュールに分割することを強くお勧めします。

プロファイルを使用してこれを行うこともできますが、プロジェクトを 2 つ (実際には 3 つ) に分割する方が簡単です。長期的には、アプリケーションの規模が拡大するにつれて直面する課題があります。分類された各 JAR に含まれるクラスとパッケージのこの手動リストを理解するのは、あなたの責任です。

2 つの個別のモジュールを参照する単純な親プロジェクトを持つことによるオーバーヘッドは最小限です。無料の Maven by Example ブックを見ると、単一モジュール プロジェクトと複数モジュール プロジェクトの間で移行を行う方法が示されています。 第 3 章から第 5 章では単一モジュール プロジェクトに焦点を当て、第 6 章ではこれらの単一モジュール コンポーネントを組み合わせてより大きな複数モジュール プロジェクトにする方法を示します。

詳細については:

質問には次のトピックが含まれます。それぞれの詳細を提供するリンクがいくつかあります。

Maven JAR プラグイン: http://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html

マルチモジュール Maven プロジェクト: Maven by Example の第 6 章およびMaven: The Complete Reference のセクション 3.6.2

Maven ライフサイクル (パッケージが "jar" の場合、jar はパッケージにバインドされます): Maven by Example "Core Concepts" のセクション 3.5.2およびMaven: The Complete Reference の第 4 章

Maven アセンブリ: 最初にMaven アセンブリ プラグイン サイト、次にMaven: The Complete Reference の第 8 章で、いくつかの重い (ほとんど重すぎる) 詳細について説明します。

于 2010-01-26T16:31:45.710 に答える
23

あなたの最初の考えは正しいものです。2つの部分を2つのプロジェクトに分割します。

Mavenの哲学は、各プロジェクトが唯一のアーティファクト(jar、warなど)を構築する必要があるというものです。

おそらく、何かを一緒にハックして、2つのアトリファクトを構築するMavenプロジェクトを1つだけにすることもできますが、それはハックになります。

mavenからantを呼び出すことができるので、本当にこれを実行したい場合は、mavenantプラグインを調べ始めることをお勧めします。アーティファクトIDは「maven-antrun-plugin」です

于 2010-01-25T14:43:17.227 に答える
5

次の 2 つの選択肢があります。

サブセットが単なるリソースのコレクションである場合は、個別のモジュールにはしません。

プロジェクトが常に統一された方法でパッケージ化されたサブセットに依存している場合、サブセットはモジュールになる良い候補です。

サブセットが複数の異なる「フレーバー」に再パッケージ化されている場合は、「フレーバー」ごとにアセンブリを定義し、アーティファクト名を「分類子」で修飾します。 maven 座標を参照してください。

最後に、プロファイルを使用して、生成されるアセンブリを決定できます。デフォルト プロファイルは、開発中に必要な最初のアーティファクト「フレーバー」のみを作成する場合があります。
「フル」プロファイルは、開発が完了したら、最終的な展開のためにアーティファクトのすべての「フレーバー」バリアントを生成する場合があります。

于 2010-01-25T14:51:52.120 に答える