私は、多数の (約 50 以上の) Maven2 プロジェクトを整理して、中央の Nexus リポジトリにデプロイできるようにする方法を考えています。目標を使用する場合はmvn deploy
、次のように distributionManagement タグでターゲットを指定する必要があります。
<distributionManagement>
<repository>
<id>nexus-site</id>
<url>http://central_nexus/server</url>
</repository>
</distributionManagement>
さて、50 個以上の pom.xml のすべてにこのブロックが何度も含まれるのは望ましくありません。最初に思いつくのはファイルですsettings.xml
が、そこで定義するのは (設計上) 不可能のようです。そこで、最初の質問は、なぜそうなるのか、ということです。可能であれば、すべての開発者に配布できる Maven2 ディストリビューションの settings.xml で指定できます。
私が見つけた唯一の解決策は、これらの設定を含む組織全体のマスター POM プロジェクトを作成し、他のすべての pom.xml が<parent>
タグを介してこのマスター POM に依存できるようにすることでした。しかし、これはマルチモジュール ビルドでは少し奇妙に見えます。
- master configuration POM (pm)
- Project 1 parent pom (p1 with module 1 and module 2 as modules)
- Project 1 module pom (with pm as parent)
- Project 2 module pom (with pm as parent)
通常、すべてのドキュメントでは、モジュール POM は別の POM ではなく、親 POM を使用する必要があると読みます。ただし、継承と集約に関する Maven Web サイトを読んだ後、それが実際に可能であることが書かれています。
私が見つけた問題の 1 つは、Maven サイト生成に関するもので、この設定では問題があるようです (直接のバック参照がない場合、モジュールは正しくリンクされません)。
それで、これは有効なアプローチでしょうか? この問題に対する、他の、より明白で、より簡単な解決策はあるでしょうか?
ベストアンサー1
これに対する最善の解決策は、組織のすべてのプロジェクトに対して汎用的に単純な親 pom ファイル プロジェクト (パッケージ 'pom' を使用) を作成することです。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>your.company</groupId>
<artifactId>company-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<distributionManagement>
<repository>
<id>nexus-site</id>
<url>http://central_nexus/server</url>
</repository>
</distributionManagement>
</project>
これをビルド、リリース、ローカル ネクサスにデプロイして、誰もがその成果物にアクセスできるようにします。
これを使用したいすべてのプロジェクトに、次のセクションを含めるだけです。
<parent>
<groupId>your.company</groupId>
<artifactId>company-parent</artifactId>
<version>1.0.0</version>
</parent>
このソリューションを使用すると、会社のすべてのプロジェクトに他の共通項目を簡単に追加できます。たとえば、JUnit の使用を特定のバージョンに標準化したい場合、これは最適な場所です。
独自の親を持つマルチモジュール構造を使用するプロジェクトがある場合、Maven は継承の連鎖もサポートしているため、プロジェクトの親 pom ファイルが会社の親 pom を参照するようにし、プロジェクトの子モジュールが会社の親を認識しないようにすることも完全に許容されます。
サンプル プロジェクト構造から、親プロジェクトをアグリゲータ pom と同じレベルにしようとしていることがわかります。プロジェクトに独自の親が必要な場合、私が見つけた最良の方法は、親を残りのモジュールと同じレベルに含め、すべてのモジュールのディレクトリが存在するルートにアグリゲータ pom.xml ファイルを配置することです。
- pom.xml (aggregator)
- project-parent
- project-module1
- project-module2
この構造で行うことは、親モジュールをアグリゲータに含め、mvn install
ルート ディレクトリからすべてを構築することです。
私たちの組織ではまさにこのソリューションを使用しており、長い間その効果を発揮し、非常にうまく機能しています。