0

Mavenの初心者なので、一度に複数の分類子を使用できるかどうかを知りたいです。私の場合は、1回の実行でさまざまなjarを生成するためのものです。このコマンドを使用してプロジェクトをビルドします。

mvn -Dclassifier=bootstrap package

論理的には、これは可能だと思います。

mvn -Dclassifier=bootstrap,api package

Maven3.0.4を使用しています

4

1 に答える 1

2

あなたのプロジェクトは、Maven が「モジュール」と呼ぶもののいくつかにリファクタリングする候補のようです。これには、コードを単一のディレクトリ ツリー内の個別のプロジェクトに分割することが含まれます。最上位レベルは、通常、サブプロジェクト ディレクトリ名を含むリストを<packaging>pom</packaging>持つ親またはアグリゲータ POM です。<modules/>

次に、API インターフェイス/例外/whatnot を独自の pom.xml を持つ api/ サブディレクトリに配置し、ブートストラップ クラスを独自の pom.xml を持つ bootstrap/ サブディレクトリに配置することをお勧めします。最上位の pom.xml は、次のようにモジュールを一覧表示します。

<modules>
  <module>api</module>
  <module>bootstrap</module>
</module>

プロジェクトをリファクタリングしたら、おそらくブートストラップ モジュールから api モジュールへの依存関係を追加したいと思うでしょう。アピから。

これで、ディレクトリ構造の最上位に移動して、次のように呼び出すことができるはずです。

mvn clean install

コードでさまざまなユースケースがどのようにサポートされているかを考える必要があり、クラス間の依存関係サイクルを見逃すのが難しくなるため、このアプローチは優れています。

例をたどりたい場合は、私の github プロジェクトの 1 つを見てください: Aprox

注: api モジュールに依存するモジュールが多数ある場合は、セクションの最上位の pom.xml にリストすることをお勧めします<dependencyManagement/>。これにより、サブモジュールの依存関係宣言でバージョンを省略できるようになります (依存メカニズムの紹介を参照) 。 .

更新: レガシーに関する考慮事項

従来の理由などでコードベースをリファクタリングできない場合は、基本的に次の 2 つのオプションがあります。

  1. 空のマルチモジュール構造で一連の pom.xml ファイルを構築し、build-helper-maven-plugin とソースの include/exclude を使用してコードベースを断片化し、単一のソース ツリーから異なるモジュールにクラスを割り当てます。

  2. おそらく、アセンブリ プラグインのようなプラグインを使用して、ターゲット/クラス ディレクトリ ( ${project.build.directory}) を分割し、クラスを異なる jar に割り当てます。このシナリオでは、各アセンブリ記述子に が必要で<id/>あり、既定では、この値がそのアセンブリ jar の分類子になります。この計画では、「メイン」の jar 出力は引き続き Maven ビルドによって作成されたモノリシックなものになります。これを望まない場合は、アセンブリ プラグインを個別に実行し、構成で<appendAssemblyId>false</appendAssemblyId>. そのアセンブリの出力が jar の場合、jar プラグインからの古い出力が効果的に置き換えられます。このアプローチを追求することにした場合は、アセンブリ プラグインのドキュメントを読んで、さまざまな例にできるだけ多く触れることをお勧めします。

また、どちらの場合も、ビルドのさまざまな部分をオン/オフするために、pom で一連のプロファイルを使用して生成されたもののリストを操作することに行き詰まることに注意してください。すべてを生成するデフォルトの非修飾ビルドを作成することを強くお勧めします。これにより、リリース プラグインなど、リリースしたいものすべてをキャッチする可能性が高くなり、バージョンのアップなども適切に行われます。

これらのソリューションは通常、コードベースを一度にリファクタリングできない場合の移行手順として私が推奨するものです。これらは、単一のソース ツリーから複数の jar を生成する Ant ビルドなどから移行する場合に特に役立ちます。

于 2012-12-19T18:46:40.800 に答える