web-dev-qa-db-ja.com

組織全体のMaven配布管理を指定するには?

多くの(約50以上の)maven2プロジェクトを整理して、中央のネクサスリポジトリに展開できるようにする方法を見つけようとしています。 mvn deployゴールを使用する場合、次のようにdistributionManagementタグでターゲットを指定する必要があります。

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

今、私はすべてのpom.xml(これらの50以上の)にこのブロックが何度も含まれることを望んでいません。私の最初のファイルはsettings.xmlファイルですが、そこに定義することは(設計上)不可能なようです。だから、最初の質問は、なぜそうなのでしょうか?可能であれば、maven2ディストリビューションのsettings.xmlで指定し、すべての開発者に配布できます。

私が見つけた唯一の可能な解決策は、これらの設定を含む組織全体のマスターpomプロジェクトを作成し、<parent>タグを介して他のすべてのpom.xmlをこのマスター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)

通常、すべてのドキュメントで、モジュールpomsは親pomを使用すべきであり、別のpomを使用すべきではないと読んでいます。しかし、継承と集約に関するMavenのWebサイトを読んだ後、実際に可能であると書かれています。

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

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

100
mglauche

これに対する最善の解決策は、組織のすべてのプロジェクトに対して一般的な単純な親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>

これは、ローカルnexusにビルド、リリース、およびデプロイできるため、誰でもそのアーティファクトにアクセスできます。

使用したいすべてのプロジェクトについて、このセクションを含めるだけです:

<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を使用してすべてを構築することです。

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

136
Jesse Webb

親POMは必要ありません。

PomsでdistributionManagement部分を完全に省略し、ビルドサーバーまたはsettings.xmlで設定できます。

ビルドサーバーで実行するには、mvnコマンドに渡します。

-DaltSnapshotDeploymentRepository=snapshots::default::https://YOUR_NEXUS_URL/snapshots
-DaltReleaseDeploymentRepository=snapshots::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>

「snapshots」と「releases」の資格情報がsettings.xmlの<servers>セクションにあることを確認してください

8
Michael Wyraz