2010-12-01 20 views
14

mavenを使用すると、パッケージングタイプのトップレベルのプロジェクトを "war"とし、それ自身とそれに依存するすべてのモジュール(jarパッケージ)をビルドしてproject.warファイルを生成させることができますか?mavenプロジェクトは独自の依存関係を構築していますか?

私がよく見たドキュメンテーションの例や他の例の多くは、パッケージタイプが「pom」のトップレベルプロジェクトを使用しています。プロジェクトは、モジュール同士を結びつけるという目的しかありません。これを避けることはできますか?

基本的には、ビルドする必要がある同じモジュール上に<dependency>...my-module's artifact...</dependency>と宣言している同じPOM内で、mavenをビルドするには<module>my-module</module>と宣言するのが効果的です。誰かが既に提案しているプラ​​グインかもしれない?

更新:つまり(問題を単純化する)には:私はproject Aproject Bに依存project Aproject Bを、持っている場合 - 私はproject A上でビルドを実行しても、それが自動的にproject Bを構築していするための方法があります(その依存関係としてproject Bを含める - projectB.jarを含むprojectA.warを作成する)?

+2

これは、mavenコマンドラインから行うことができます。 'mvn compile -pl projectA -am'です。この[あなたの質問](http://stackoverflow.com/questions/9167015/how-to-compile-dependency-in-maven)助けてください。 – amaidment

答えて

9

これは、トップレベルプロジェクトの目的ではありません。 WARプロジェクトには依存関係があります。これは、 'mvn package'を実行するときにWAR(WEB-INF/lib内)に含まれるアーティファクト(jarなど)です。 WARプロジェクトのpomは、トップレベルのプロジェクトを親として持つことができますが、その依存関係の親であってはいけません。そのトップレベルのプロジェクトを、WARプロジェクトとWARの依存関係であるJARプロジェクトの両方の親にすることができます。

+0

まあ、私が何を意味しているかは、トップレベルのプロジェクトが欲しくないということです。依存関係の文字列を持つプロジェクトが必要で、チェーン全体を構築するための「ダミー」トップレベルプロジェクトを作成する必要がないようにしたいと考えていました。 – oym

+0

ああ...パッケージタイプに関係なく、プロジェクトの依存関係を構築する方法はわかりませんが、プラグインによってはそれが存在するかもしれません。私はpomの依存関係として含まれているプロジェクトのために私のソースコードリポジトリを検索するためにjavaで私自身のユーティリティを書いていました。依存関係のソースをチェックアウトし、pomのバージョンをインクリメントしてビルドし、メインプロジェクトのpomの依存関係を更新して、依存関係の新しいバージョンを反映します。 –

+0

同じpom.xml内で、プロジェクトをビルドするモジュールとして指定し、それを依存関係として宣言するといいでしょう。 – oym

0

- (まあ、私はいくつかの方法を考えることができますが、畳み込まれていて、Mavenの基本的なエモス/プラクティスに反して使いません)。

トップレベルのpomの他の目的は、プロジェクトのモジュールで使用される特定のバージョンの依存関係などの共通の詳細を設定するための単一のポイントを提供することです。

1

親のpomでは、コンパイルするモジュールの順番を定義する必要があります。そのリストの最後にwarパッキングモジュールを追加することができます。以前のコンパイル済みコードをすべて集約するだけです。

+6

シーケンシャル。すべてのpomと依存関係を処理するときに、mavenはその順序を決定します。 – Salandur

0

NetBeansには、Mavenプロジェクトでこれを正確に行うことができるオプションがありますが、純粋なMavenソリューションはわかりません。私はこの作業がIDEに適していると思います。なぜなら、あなたはコードを持っているプロジェクトに依存していることを知っているからです(あなたがワークスペースで開いたプロジェクトに基づいて)。 Maven自身がビルドしたい依存関係と、リポジトリからフェッチする必要のある依存関係をどのように区別しますか?ビルドする必要のある人は、どこでソースコードを探すべきでしょうか?

とにかく、問題を解決するもう1つの方法は、プロジェクトフォルダに移動してビルドを開始する単純なシェルスクリプトを作成し、終了するのを待ってから次のプロジェクトに進みます等々。あなたは次のような構造を持つことができproject-core

として

project-webappとしてProjectAをConsedering、ProjectB

11

super_aardvarkは、要件の
が、私はそれが適切である構造とも良い構造を以下示唆し、正しい方法を提案したが、 :

あなたのグランドプロジェクト:

<?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>com.mycompany.project</groupId> 
    <artifactId>project</artifactId> 
    <version>2.0-SNAPSHOT</version> 
    <packaging>pom</packaging> 

    <name>Project Repository System</name> 
    <description>Project Repository System R2</description> 

    <modules> 
     <module>project-core</module> 
     <module>project-webapp</module> 
    </modules> 
</project> 

、Webアプリケーションプロジェクト:

<?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"> 
    <parent> 
     <groupId>com.mycompany.project</groupId> 
     <artifactId>project</artifactId> 
     <version>2.0-SNAPSHOT</version> 
    </parent> 
    <modelVersion>4.0.0</modelVersion> 
    <artifactId>project-webapp</artifactId> 
    <version>2.0-SNAPSHOT</version> 
    <packaging>war</packaging> 
    <name>Project Web Application</name> 
    <description>Project Repository</description> 
    <dependency> 
      <groupId>com.mycompany.project</groupId> 
      <artifactId>project-core</artifactId> 
      <version>2.0-SNAPSHOT</version> 
    </dependency> 

</project> 

あなたのコアプロジェクト:

<project> 
    <parent> 
     <groupId>com.mycompany.project</groupId> 
     <artifactId>project</artifactId> 
     <version>2.0-SNAPSHOT</version> 
    </parent> 
    <modelVersion>4.0.0</modelVersion> 
    <artifactId>project-core</artifactId> 
    <version>2.0-SNAPSHOT</version> 
    <packaging>jar</packaging> 
    <name>Project Core</name> 
    <description>ProjectCore</description> 

</project> 

あなたディレクトリ構造は、次のようになります。

親から

ポンポンmvn clean installを実行し、それは私がこれを放棄することをお勧めしたい、これはMavenの1では不可能である、両方のWebアプリとコアプロジェクト2または3

+0

これは実際に私が質問する前に持っていたものです。私の目標は "祖父母"を取り除き、 "project-webapp"自身と "project-core"を構築することでした。ありがとう。 – oym

+0

私は、プロジェクトWebAppがサブモジュールを持つ "祖父母"であるように、あなたがそれをセットアップさせることはできないということはおかしいと思います。現在のところ、祖父母側からは2つのモジュールが表示されますが、一方が他方に依存しているわけではありません。 – dtc

9

を構築しますMavenの全目的は標準化された開発プロセスを実施することであるからです。構造体と戦わないでください。親POMモジュールを作成し、その下にWARモジュールやその他の依存関係を作成してください。

+0

upvoted、bcoz uが質問を理解しています –

1

マルチモジュールプロジェクトがあり、複数のモジュールで同時に作業していると、退屈でエラーが発生して、必要な依存関係がすべて更新されることがあります。

私の状況では、自分のビルドシステムが変更を検出し、必要なモジュールのみをビルドするようにしたいと思います。これがmavenで可能な方法の1つは、これを行うカスタムプラグインを書くことです。これは、mavenリリースプラグインのように、既に利用可能な複雑なプラグインがあるので、克服できないようです。

他の人はすでに集約ポームの概念について言及していますが、これは繰り返し可能であり、必要な人工物を生成します。しかし、時には、あなたが本当に必要とする以上のものを構築することになります。

Mavenのプロファイルを支援し、ここでその点では良い記事だことができます。

Using Aggregate and Parent POMs

また記事で、私は以前に気づいていなかったバッチポンポン、の概念に注意してください。

mvn clean installは、あなたのアーティファクトをローカルリポジトリにプッシュします。したがって、モジュールAがモジュールBに依存する場合、ローカルリポジトリにモジュールBの最新ビルドがある限り、すべての設定が必要です。したがって、モジュールBへの変更を監視していて、その変更がローカルリポジトリにプッシュされたときにモジュールBを自動的にビルドした外部ツールがあれば、モジュールAが再構築されたときにそれらの変更を取得します。Jenkinsのように、これを実行できる継続的な統合(CI)ツールがあります。しかし、ローカルリポジトリと直接連携するには、ローカルインストールが必要です。しかし、それはまだ選択肢です。

もう1つの選択肢は、CI環境でビルドを外部のMavenリポジトリにプッシュすることです(またはNexusなどのローカルで設定することもできます)。次に、CIビルドをセットアップしてその場所からプルします。

他のツールや潜在的なプラグインに依存するソリューションがあります。これは、すべての設定を行うために投資する時間と労力の大きさによって異なります。しかし、いったんそのハードルを乗り越えれば、すべてのプロジェクトで使用できるシステム(および知識と経験)が得られます。開発店やチームの数に慣れていることは言うまでもありません。

詳細情報とアイデアを得るため、継続的な統合と継続的な配信をお勧めします。

関連する問題