1. ホーム
  2. java

[解決済み] mavenのdistributionManagementを組織全体で指定する方法は?

2022-02-11 21:19:15

質問

私は、多くの(およそ50以上の)maven2プロジェクトを整理して、それらが中央のnexusリポジトリにデプロイできるようにする方法を見つけようとしています。このような場合 mvn deploy のように、distributionManagement タグでターゲットを指定する必要があります。

<distributionManagement>
   <repository>
      <id>nexus-site</id>
        <url>http://central_nexus/server</url>
   </repository>
</distributionManagement>

さて、(50以上のpom.xmlのうち)すべてのpom.xmlにこのブロックが何度も何度も含まれるのは困ります。まず最初に考えるのは settings.xml ファイルでは定義できないようです(設計上)。 そこで、まず疑問に思うのは、なぜそうなのか、ということです。もし可能であれば、すべての開発者に配布されるmaven2ディストリビューションのsettings.xmlでそれを指定することができるのですが。

私が見つけた唯一の可能な解決策は、これらの設定を含む組織全体の master-pom プロジェクトを作成し、他のすべての pom.xml を、以下の方法でこの master-pom に依存させることでした。 <parent> タグを使用します。しかし、これはマルチモジュールビルドではちょっと変な感じです。

- 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を使用すべきであると読みます。しかし、mavenのサイトで継承と集約について読んだ後、それは確かに可能であると書かれています。

このセットアップには問題があるようです(モジュールが直接後方参照されない場合、正しくリンクされません)。

それで、この方法は有効ですか?他にもっと明白でシンプルな問題解決方法がありますか?

解決方法は?

この問題の最良の解決策は、組織内のすべてのプロジェクトに対して、単純な親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 をルートディレクトリから取得します。

私の組織では、まさにこの解決策を使用しており、時の試練に耐え、私たちにとって非常にうまく機能しています。