it-swarm-ja.tech

Maven-親から独立できる子プロジェクトを作成する

私は少しMavenの初心者で、いくつかの子プロジェクトをビルドするMavenプロジェクトをセットアップしようとしていますが、それでも誰かが子プロジェクトの1つを取得して、親なしで独立してビルドすることができます。

parentfolder
  ->pom.xml
  ->project1
    ->pom.xml
    ->src
  ->project2
    ->pom.xml
    ->src
  ->project3
    ->pom.xml
    ->src

基本的に、誰かが親フォルダーをチェックアウトしてmvnコンパイルを実行してすべてのプロジェクトをビルドできるようにし、また誰かがproject1だけをチェックアウトしてmvnコンパイルを実行してそれだけをビルドできるようにしたいです。

サブプロジェクトをトップレベルのpom.xmlのモジュールとして宣言してみました。

<modules>
  <module>project1</module>
  <module>project2</module>
  <module>project3</module>
</modules>

ただし、親のpom.xml情報を子で宣言する必要があるようです。これにより、子プロジェクトは存在する親pom.xmlに依存するようになります。これは、私が避けたかったことです。

29
Dana

Maven2の親子関係と集計の概念の違いに注意する必要があります。それらは、実際に同時に頻繁に使用される場合でも、同じ原則ではありません。

[〜#〜]親[〜#〜]

最初の概念は、プロジェクトがpom.xmlで親を宣言することです。

<project>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>foo</groupId>
        <artifactId>bar</artifactId>
        <version>42</version>
    </parent>
    ...

この場合、このコンポーネントをビルドするには、親プロジェクトがローカルリポジトリにある必要があります。これはここでのあなたのケースです。

Maven 2の親概念の関心は、プロパティ、依存関係、構成を継承することです。これは、子供たちのプロジェクトのすべての一般的な情報を置く場所です。

これは、Java言語のextendsとまったく同じ概念です。

[〜#〜]集計[〜#〜]

この場合、moduleノードで名前を指定することにより、いくつかのサブモジュールを集約するプロジェクトがあります。

<modules>
    <module>commons</module>
    <module>client</module>
    <module>server</module>
    ...
</modules>

これは、このルートプロジェクトで実行するすべてのコマンドが各モジュールで実行されることを意味します(順序はMaven 2 Reactorによって定義されます)。たとえば、ルートプロジェクトでmvn clean installを実行すると、Maven 2はこのコマンドをルートプロジェクト、プロジェクトcommonsclient、最後にserverで実行します。

この概念では、他の1つのプロジェクトをコンパイルせずに1つのプロジェクトをコンパイルできます(もちろん相互依存関係がある場合を除く)。

これは、2つの異なる概念を示すスキーマです。

alt text

Maven:The Definitive Guide、 here で、これら2つの概念についてより詳細な説明があります。

56
Romain Linsolas

サブプロジェクトは、<parent>タグ(Maven継承)を使用する場合にのみ親に依存します。サブモジュールで<parent>タグを使用する必要はありません。ただし、モジュールで親pomから共通の要素を継承する場合は、Maven継承を使用する必要があります。

厳密に言えば、継承を使用してareサブプロジェクトのみをビルドする場合は、親pom.xmlが親ディレクトリに存在する必要はありません。 Mavenがローカルまたはリモートリポジトリで親pomを見つけることができる限り、それはビルドされます。実際には、親pomで変更が行われている場合は、チームメンバーが親pomを最新の状態に保つ方法を検討する必要があります。

1
Ken Liu

親pomとそのバージョンは、子で宣言する必要があります。

プロジェクトで親が宣言されている場合は、ビルドで使用できるため、モジュールの1つが親pomであるか、リポジトリで使用できる必要があります。親に依存しているが、親にアクセスできず、依存関係のないプロジェクトをビルドしようとしているようなプロジェクトをビルドできるようにするプロジェクトを誰かにチェックアウトしてほしいと言っているようです。

親pomを使用可能にするオプションは次のとおりです。

  • パブリックMavenリポジトリーをセットアップし、それに親pomをデプロイし、リポジトリー情報を子pomsに配置します。
  • リポジトリをチェックする前に、相対パスで親pomを探すようにmavenに指示できます(これは、まだデプロイされていない親pomにローカルな変更がある場合に役立ちます)。したがって、子プロジェクトでsvn:externalまたはそれに相当するものを親pomに対して実行することもできます。
0
Scott Ray

この問題は、 Project Inheritance の代わりにmavenの Project Aggregation を使用することで解決できます。

0
Neil

問題は、Mavenが親タグをオーバーロードしていることだと私には思えます。 Mavenのドキュメントでは、継承と集約は2つの異なるものであると言われていますが、どちらも同じタグを使用して機能を実現しています。これは、元の投稿者が求めているシナリオに反するものです。したいかもしれません

  1. 共通の親から特定の設定を継承しますが、
  2. 共通のコンポーネントを共有する異なるアプリケーションの2つのビルドがあります。

したがって、ここでは親の関係について2つの異なる理解があります。 1つ目は、各モジュールの設定に寄与する「親」であり、2つ目は、ビルドが子をビルドする「親」です。後者が2つあるので、これは故障します。親子関係の2つのアイデアはお互いの邪魔になります。

0
user254082