2017-12-03 20 views
0

に子モジュールからのjarファイルを収集するために、Mavenの集約と継承を使用することができます。その目的は、サブモジュールC-1とC-2(それにはの親であるになる)と集約モジュールC-1とC-2が1つのタールボールをビルドするモジュールのC targetディレクトリ。は、どのように私は、私は次のような構造を持つマルチモジュールのMavenプロジェクトを持っている親のtarボール

この目標をすることによって達成される:

  • ルートpom.xmlリストモジュール、B、及びC
  • モジュールC pom.xmlリストモジュールC-1とC-2と共有依存関係を宣言する。パッケージ "pom"と宣言します
  • maven-assembly-pluginは、すべての*.jarファイルを子供のtargetディレクトリで見つけ、それらをtgzでパックするためにモジュールCで使用されます。

私はこの実装で直面するいくつかの問題があります。単純なものはC-1とC-2の自己依存性であり、Cからの依存関係を継承してコンパイルを拒否します。私はその依存関係をCのdependencyManagementにラッピングするようにしました。

また、アセンブリプラグインにも問題があります。ファイルセットの値にwildcharsを使用すると、生成されたtarボールのディレクトリ構造が保持され、何もできないように見えます。だから私はそれがあまりにも重要ではありませんだけで

moduleC-version/moduleC-1-version.jar 
moduleC-version/moduleC-2-version.jar 

オーケーを、必要なときのtarball

<fileSet> 
     <directory>${project.basedir}</directory> 
     <outputDirectory>/</outputDirectory> 
     <includes> 
      <include>**/*.jar</include> 
     </includes> 
     <excludes> 
      <exclude>**/*-javadoc.jar</exclude> 
     </excludes> 

    </fileSet> 

結果は構造

moduleC-version/moduleC-1/target/moduleC-1-version.jar 
moduleC-version/moduleC-2/target/moduleC-2-version.jar 

を持つモジュールCのbin.xmlに次なります。主な問題はReactor Build Orderです。どのような私はそれが

  1. モジュール
  2. モジュールBになりません
  3. モジュールC
  4. モジュールC-1
  5. モジュールC-2

そして、それはビルド以来の失敗ですモジュールC上で文句を言う

アセンブリの作成に失敗しました:アセンブリアーカイブビンの作成中にエラーが発生しました:少なくとも1つのファイルを設定する必要があります。 - > [ヘルプ1]

私の理解では、問題はReactor Build Order - C-1とC-2をCの前にビルドしなければならないということですが、管理方法はわかりませんそれはCを親に持ち、モジュール構造の上にとどまっています。

+0

最も重要な部分は、maven-assembly-pluginの設定を含む別のモジュール(dist)を持つことです。そこでは、依存関係としてパッケージ化したいすべてのモジュールを定義して、各依存関係がモジュールdistの前に構築されていることを確認する必要があります。さらに[this](https://github.com/khmarbaise/assembly-examples/blob/master/assemblies-with-reactor/dist/proj1-assembly.xml)のような記述子を使用し、[this](https: //github.com/khmarbaise/assembly-examples/tree/master/assemblies-with-reactor)。 – khmarbaise

+0

@khmarbaiseありがとう、それはオプションです、なぜあなたは答えとしてここに入れませんか?この例ではdist/pom.xmlのように見えますが、Reactorはすべての依存関係を明示的にリストする必要はありません。つまり、Reactorはモジュールをリストする順序を尊重するため、distを最後に置き、依存関係を取り除くだけです。 –

+0

あなたが明示的にパッケージ化したいモジュールを 'dist/pom.xml'の依存関係として定義することを強くお勧めします。何らかの理由(新しいモジュールのマージ/変更/追加)でモジュールの順序を変更した場合、ビルドに失敗します。 。 – khmarbaise

答えて

1

パッケージ(zipなど)のような配布が必要な場合は、その構成を含む別のモジュールを定義する必要があります。 さらに、パッケージ化したい各モジュールを依存関係として定義し、ビルド順がmavenによって正しく行われるようにする必要があります。

あなたはthis:

+- pom.xml 
+-- mod1 
+-- mod2 
+-- dist 

更新などのthis:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> 

    <id>dist-assembly</id> 

    <formats> 
     <format>zip</format> 
    </formats> 

    <includeBaseDirectory>false</includeBaseDirectory> 

    <dependencySets> 
     <dependencySet> 
      <outputDirectory>/</outputDirectory> 
      <useProjectArtifact>false</useProjectArtifact> 
      <unpack>false</unpack> 
      <scope>runtime</scope> 
     </dependencySet> 
    </dependencySets> 
</assembly> 

プロジェクトの構造がより見えるかのようなルックスを使用する必要がありますのmaven-組立・プラグインの記述:

あなたの場合代わりにアセンブリ記述子としてこれを行うことができるモジュールだけが必要です:

<moduleSets> 
    <moduleSet> 
     <useAllReactorProjects>true</useAllReactorProjects> 
     <binaries> 
     <outputDirectory>modules</outputDirectory> 
     <unpack>false</unpack> 
     </binaries> 
    </moduleSet> 
</moduleSets> 
+0

Reactorは、マルチスレッドモードで**実行しない限り、モジュールシーケンスのみに基づいてすべてのものを注文します**。それから、配布プロジェクトは本当にそれが依存する前に起こるかもしれません。しかし、私はサブプロジェクトの2つのリストを維持しなければならないが、1つは配布用POMの依存関係として、もう1つは集約POM内のモジュールのリストとして維持しなければならない。可能であれば、1つだけを保つことが大好きです。 –

+0

モジュールのシーケンスは信頼できないため使用しないでください。モジュール間の正しい依存関係を定義する。それは常に動作するよりも...あなたがマルチスレッド実行を使用している場合にも...(mvn -T ...) – khmarbaise

関連する問題