[解決済み】Mavenの親POMとモジュールPOMの比較
質問
マルチプロジェクトビルドで親POMを構成する方法はいくつかあるようですが、それぞれの方法の利点と欠点について、どなたか考えをお持ちではないでしょうか。
親Pomを持つ最もシンプルな方法は、プロジェクトのルートに置くことです。
myproject/
myproject-core/
myproject-api/
myproject-app/
pom.xml
pom.xml は親プロジェクトであると同時に、-core -api と -app モジュールを記述しています。
次の方法は、次のように親を独自のサブディレクトリに分離することです。
myproject/
mypoject-parent/
pom.xml
myproject-core/
myproject-api/
myproject-app/
親Pomにまだモジュールが含まれているが、相対的なものである場合、例えば ../myproject-core
最後に、モジュールの定義と親を次のように分離するオプションがあります。
myproject/
mypoject-parent/
pom.xml
myproject-core/
myproject-api/
myproject-app/
pom.xml
親 pom にはあらゆる共有設定 (依存関係管理、プロパティなど) が含まれ、myproject/pom.xml にはモジュールのリストが含まれます。
大規模なビルドに対応するため、多数のプロジェクトや成果物に対してスケーラブルであることが望まれます。
おまけ質問です。
- ソース管理、デプロイメントディレクトリ、共通プラグインなど、様々な共有設定を定義するのに最適な場所はどこでしょうか(親を想定していますが、これに噛んでしまい、共通ではなく各プロジェクトに入ってしまうことがよくあります)。
- maven-releaseプラグイン、hudson、nexusは、マルチプロジェクトのセットアップ方法にどのように対応していますか(巨大な質問かもしれませんが、マルチプロジェクトのビルドがどのようにセットアップされているかに引っかかった人がいれば、ということです)。
編集:サブプロジェクトはそれぞれ独自のpom.xmlを持っていますが、簡潔さを保つために省きました。
解決方法は?
私の考えでは、この質問に答えるには、プロジェクトのライフサイクルとバージョン管理の観点から考える必要があります。言い換えれば、親Pomは独自のライフサイクルを持っているのか、つまり、他のモジュールとは別にリリースできるのか、そうでないのか、ということです。
もし、その答えが はい (これは質問やコメントで言及されたほとんどのプロジェクトのケースです)、親pomはVCSとMavenの観点から独自のモジュールを必要とし、VCSレベルではこのようなものになります。
root
|-- parent-pom
| |-- branches
| |-- tags
| `-- trunk
| `-- pom.xml
`-- projectA
|-- branches
|-- tags
`-- trunk
|-- module1
| `-- pom.xml
|-- moduleN
| `-- pom.xml
`-- pom.xml
このため、チェックアウトが少し面倒になり、その対処法として一般的なのが
svn:externals
. 例えば
trunks
ディレクトリを作成します。
root
|-- parent-pom
| |-- branches
| |-- tags
| `-- trunk
| `-- pom.xml
|-- projectA
| |-- branches
| |-- tags
| `-- trunk
| |-- module1
| | `-- pom.xml
| |-- moduleN
| | `-- pom.xml
| `-- pom.xml
`-- trunks
以下のようなexternalsの定義で。
parent-pom http://host/svn/parent-pom/trunk
projectA http://host/svn/projectA/trunk
のチェックアウト
trunks
を実行すると、以下のようなローカル構造になる(パターン2)。
root/
parent-pom/
pom.xml
projectA/
オプションで、さらに
pom.xml
の中に
trunks
ディレクトリを作成します。
root
|-- parent-pom
| |-- branches
| |-- tags
| `-- trunk
| `-- pom.xml
|-- projectA
| |-- branches
| |-- tags
| `-- trunk
| |-- module1
| | `-- pom.xml
| |-- moduleN
| | `-- pom.xml
| `-- pom.xml
`-- trunks
`-- pom.xml
これは
pom.xml
は一種の "fake" pom です。このファイルは決してリリースされないので、本当のバージョンは含まれておらず、モジュールのリストだけが含まれています。このファイルでは、チェックアウトするとこのような構造になります(パターン3)。
root/
parent-pom/
pom.xml
projectA/
pom.xml
このハックは、チェックアウト後にルートからリアクタービルドを起動し、より便利にするためのものです。実際、私はこの方法でmavenプロジェクトとVCSリポジトリをセットアップして 大規模ビルド うまくいくし、スケールもするし、必要な柔軟性はすべて備えています。
という答えが返ってきたら いいえ (最初の質問に戻りますが)それなら、パターン1(うまくいく可能性のある最も単純なことをする)で我慢できるのではないでしょうか。
さて、ボーナスの質問について。
<ブロッククオート- ソース管理、デプロイメントディレクトリ、共通プラグインなど、様々な共有設定を定義するのに最適な場所はどこでしょうか(親を想定していますが、これに噛んでしまい、共通ではなく各プロジェクトに入ってしまうことがよくあります)。
正直、ここで一般的な回答("物事を相互化することに意味があると思うレベルを使う"など)をしない方法がわからないです。いずれにせよ、子ポムは常に継承された設定を上書きすることができます。
- maven-releaseプラグイン、hudson、nexusは、マルチプロジェクトのセットアップ方法にどのように対応していますか(巨大な質問かもしれませんが、マルチプロジェクトのビルドがどのようにセットアップされているかに引っかかった人がいるかどうかということです)。
私が使っているセットアップはうまくいっていますし、特筆すべきことはありません。
実は、パターン1について、maven-release-pluginはどのように対処しているのでしょうか(特に
<parent>
セクションは、リリース時にSNAPSHOTの依存関係を持つことができないためです)。これは鶏と卵の問題のように聞こえるが、私はそれが動作するかどうかを覚えていないだけで、テストするのがあまりにも怠惰だった。
関連
-
[解決済み] getContentPane()は具体的に何をするのですか?
-
[解決済み] XX:MaxDirectMemorySizeの既定値
-
[解決済み] javascriptでExpression言語を使うには?
-
[解決済み] javax.mail.MessagingException: SMTPホストに接続できませんでしたか?
-
[解決済み] Javaにおけるシンボリック参照
-
[解決済み] init-paramとcontext-param
-
[解決済み] Javaでdoubleをfloatに変換する
-
[解決済み] Mavenを使用して、依存関係を持つ実行可能なJARを作成するにはどうすればよいですか?
-
[解決済み】Maven モジュール + 特定の単一モジュールのビルド
-
[解決済み】mavenでJavaのバージョンを指定する - プロパティとコンパイラープラグインの相違点
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 未処理の例外タイプIOException」が表示されるのですが?
-
[解決済み] Jdbctemplate の文字列に対するクエリです。EmptyResultDataAccessException: 不正な結果サイズ:期待値1、実際0
-
[解決済み] enumのordinalを使用するのは良い習慣ですか?
-
[解決済み] java.lang.ClassCastException: java.util.Arrays$ArrayList は java.util.ArrayList にキャストできません。
-
[解決済み] java.lang.IncompatibleClassChangeError: Mongo クラスを実装しています。
-
[解決済み] java.util.concurrent.ExecutionException 例外をどのように処理しますか?
-
[解決済み] Java UnknownFormatConversionException
-
[解決済み] java.util.MissingFormatArgumentException: 形式指定子 '%s' がありません。
-
[解決済み] 文字列が一意な文字であるかどうかを判定する
-
[解決済み] タイプの安全性。アンチェック・キャスト