mavenのdistributionManagement組織全体を指定する方法は?


110

中央のネクサスリポジトリにデプロイできるように、多くの(約50以上の)maven2プロジェクトを整理する方法を理解しようとしています。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で指定できます。

私が見つけた唯一の可能な解決策は、これらの設定を含む組織全体のmaster-pomプロジェクトを作成し、他のすべてのpom.xmlをこのmaster-pom via <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を使用する必要があることを確認しました。しかし、継承v。集約についてのmaven Webサイトを読んだ後、それは確かに可能であると書かれています。

私が見つけた1つの問題は、このセットアップに問題があるように見えるMavenサイトの生成でした(直接の後方参照がない場合、モジュールは正しくリンクされません)

それで、これは有効なアプローチですか?問題に対する他のより明白で簡単な解決策はありますか?



5
@OhadR:彼らは1つのプロジェクトでそれを書く方法だけを書きます。ポイントは、私がそれを約500回複製したくなかったということです...
mglauche '23 / 07/23

1
そうですか。ポイントを取る。回答者が言ったように、「distribMngmnt」を含むプロジェクトのメインpomを作成できます...
OhadR

回答:


144

このための最善の解決策は、組織のすべてのプロジェクトに対して、一般的に単純な親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.xmlファイルを置くことです。

- pom.xml (aggregator)
    - project-parent
    - project-module1
    - project-module2

この構造で行うことは、親モジュールをアグリゲーターに含め、すべてをmvn installルートディレクトリから作成します。

私はこの正確なソリューションを私の組織で使用しており、それは時の試練に耐え、私たちにとって非常にうまく機能しました。


ここでは、プロジェクトの継承について詳しく説明し、継承の複雑さを管理する方法について説明します。;)stackoverflow.com/questions/6347913
Jesse Webb

7
ほんの少しの注意:会社の親が最適なソリューションである理由については、Mavenユーザーのリストからのsettings.xmlでdistributionManagementを指定できないという説明を参照してください。
Premek Brada、2011

「クライアントがコードを所有する」という従来のコンサルティングモデルでは、開発チームはプロジェクトをオフサイトで作業し、最新のコードをクライアントサイトに持ち込んで再度ビルドする必要があります。私の状況では、マルチモジュールプロジェクトでの作業で、プロジェクトの親POMで会社のPOMを参照している場合、クライアントの会社のPOMを指すようにその参照を更新する必要があります。手助けできるなら、settings.xmlですべての環境固有の設定を維持するように努めたいと思います。私の状況に推奨されるアプローチは何ですか?
Webユーザー

2
@WebUserあなたの問題は、この回答が対処するのではなく、POMファイルに異なる値が必要な状況に似ています。複数のモジュール間で設定が重複するのを避けます。settings.xmlファイルを介してプロパティを注入してみてください。それでも問題が解決しない場合は、SOで新しい質問をして、ここにリンクしてください。さらにサポートさせていただきます。
Jesse Webb

@JesseWebbのおかげで、私はそれを試してしまいました。私が説明した状況では、POMからこれらの値を抽象化することは有用です。私のニーズのために、アクティブなプロファイルの下に関連するプロパティとPOMで解決されたプロパティを追加しました。
Webユーザー

36

親POMは必要ありません。

pomsのdistributionManagement部分を完全に省略して、ビルドサーバーまたはsettings.xmlのいずれかに設定できます。

ビルドサーバーでこれを行うには、mvn次のコマンドを渡します。

-DaltSnapshotDeploymentRepository=snapshots::default::https://YOUR_NEXUS_URL/snapshots
-DaltReleaseDeploymentRepository=releases::default::https://YOUR_NEXUS_URL/releases

設定できるオプションの詳細については、https://maven.apache.org/plugins/maven-deploy-plugin/deploy-mojo.htmlを参照してください

これをで設定することもできますsettings.xml

有効でプロパティを含むプロファイルを作成します。

settings.xmlの例:

<settings>
[...]
  <profiles>
    <profile>
      <id>nexus</id>
      <properties>
        <altSnapshotDeploymentRepository>snapshots::default::https://YOUR_NEXUS_URL/snapshots</altSnapshotDeploymentRepository>
        <altReleaseDeploymentRepository>releases::default::https://YOUR_NEXUS_URL/releases</altReleaseDeploymentRepository>
      </properties>
    </profile>
  </profiles>

  <activeProfiles>
    <activeProfile>nexus</activeProfile>
  </activeProfiles>

</settings>

「スナップショット」と「リリース」の認証情報が<servers>settings.xmlのセクションにあることを確認してください

プロパティaltSnapshotDeploymentRepositoryおよびaltReleaseDeploymentRepositoryは、maven-deploy-pluginバージョン2.8で導入されました。古いバージョンはエラーメッセージで失敗します

Deployment failed: repository element was not specified in the POM inside distributionManagement element or in -DaltDeploymentRepository=id::layout::url parameter

これを修正するには、新しいバージョンのプラグインを適用できます。

        <build>
          <pluginManagement>
            <plugins>
              <plugin>
                <artifactId>maven-deploy-plugin</artifactId>
                <version>2.8</version>
              </plugin>
            </plugins>
          </pluginManagement>
        </build>

私はこのソリューションを継続的に試していますが、altDeploymentRepositoryプロパティのみが機能します。altReleaseDeploymentRepositoryaltSnapshotDeploymentRepositoryが認識されず、次のエラーが表示されます:デプロイに失敗しました:リポジトリエレメントがdistributionManagementエレメント内のPOMまたは-DaltDeploymentRepository = id :: layout :: urlパラメータで指定されていません。どんな提案も役立ちます。ありがとう
Shabirmean

@Shabirmean理由は、デプロイプラグインのバージョンが古すぎるためです。私は解決策で私の答えを拡張しました。
Michael Wyraz

ええ、私はそれを考え出した。:)
Shabirmean
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.