web-dev-qa-db-ja.com

パッケージングjarは無効ですAggregatorプロジェクトはパッケージングとしてpomを必要とします

私のプロジェクトにはさまざまなモジュールがあります。

  • 各モジュールには、jarパッケージを指定するpom.xmlがあります。
  • 各POMは共通の親を参照します。
  • 親モジュールには、すべてのモジュールを含むpom.xmlもあります。

親モジュールのpom.xmlを使用してパッケージ化しようとすると、「パッケージングjarは無効ですAggregatorプロジェクトはパッケージングとしてpomが必要です」というエラーが表示されます。

Mavenからアプリケーションの実行可能jarを作成するにはどうすればよいですか?

32
Anvay

簡単に言うと、親アグリゲータープロジェクトにソースコードが含まれていない場合(そして、それが良い方法です)、これを親pom.xmlに追加するだけです:

<packaging>pom</packaging>

親プロジェクトにソースコードが含まれている場合、次のことを強くお勧めします。

  • このモジュールを新しいモジュールに移動します(commonsと呼びましょう)
  • commonsを親プロジェクトの子モジュールにします
  • commonsモジュールを、それを必要とする他のすべてのモジュール(おそらくすべて)の依存関係として追加します
  • 追加 <packaging>pom</packaging>親pom.xml内
45
ben75

Mavenでは、親がpackagingpomである必要があります。

pomプロジェクトをjarプロジェクトであるかのように動作させるには、多数のプラグイン実行を含め、それらを後続のライフサイクルフェーズにアタッチします。それは幸せな道ではありません。それどころか、次のisです。

オブジェクト指向の観点から、あなたが望むものは何ですか?他のオブジェクトの束から構成されるオブジェクトが1つありますよね?つまり、継承ではなくcompositionです。

最終配信は、他の(jar)プロジェクトで構成されます。つまり、他のプロジェクトは最終配信プロジェクトの依存関係です。他のプロジェクトをそれぞれdependencyとして定義して、最終配信を使用する人が取得する(推移的な)依存関係を把握できるようにします。または、最終配信jar"uber -jar" としてパッケージ化し、すべての依存関係を含めることもできます。それはすべて、最終的な配信の使用方法に本当に依存します。

同時に、次の2つの側面が(まだ)存在します。

  • 親プロジェクト(最終配信プロジェクトとは異なり、実際には最終配信プロジェクトの親でもある可能性があります)は、継承から期待されるように、後続の子間の共通性を定義します。子は、POMのparent構成を介して親を参照するプロジェクトです。
  • 一度に簡単にビルドできるmodulesを定義するプロジェクト。モジュールは、modules.moduleを使用して参照されるプロジェクトです。これは通常、親プロジェクトで行われます(99%を超えると思います)が、必ずしもそうではありません。それを最終的な配信プロジェクトに入れることもできます(継承に影響を与えることなく、それは別の獣だからです)。
14
Sander Verhagen