web-dev-qa-db-ja.com

マルチモジュールMavenリアクタプロジェクトのルートディレクトリを見つける

Maven-dependency-pluginを使用して、マルチモジュールプロジェクトのすべてのサブモジュールからプロジェクト全体のルートディレクトリに相対的なディレクトリにEARファイルをコピーします。

つまり、私のレイアウトはこれに似ており、名前が変更されています:

to-deploy/
my-project/
    ear-module-a/
    ear-module-b/
    more-modules-1/
        ear-module-c/
        ear-module-d/
    more-modules-2/
        ear-module-e/
        ear-module-f/
    ...

そして、私はすべてのEARファイルをそれぞれのモジュールのターゲットディレクトリからmy-project/../to-deployにコピーしたいので、最終的には

to-deploy/
    ear-module-a.ear
    ear-module-b.ear
    ear-module-c.ear
    ear-module-d.ear
    ear-module-e.ear
    ear-module-f.ear
my-project/
    ...

次のように、各earモジュールの相対パスを使用してこれを実行できます。

        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy</id>
                    <phase>install</phase>
                    <goals>
                        <goal>copy</goal>
                    </goals>
                    <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>${project.groupId}</groupId>
                                <artifactId>${project.artifactId}</artifactId>
                                <version>${project.version}</version>
                                <type>ear</type>
                                <outputDirectory>../../to-deploy</outputDirectory>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </execution>
            </executions>
        </plugin>

しかし、<outputDirectory>要素に相対パスを指定したくないです。 ${reactor.root.directory}/../to-deployのようなものを好むが、このようなものは見つからない。

また、このmaven-dependency-plugin構成を継承する方法があれば、EARモジュールごとに指定する必要がないようにしたいと思います。

また、ルートポンからカスタムプロパティを継承しようとしました。

<properties>
    <myproject.root>${basedir}</myproject.root>
</properties>

しかし、ear-module POMで${myproject.root}を使用しようとすると、${basedir}はear-moduleのbasedirに解決されます。

また、私は見つけました http://labs.consol.de/lang/de/blog/maven/project-root-path-in-a-maven-multi-module-project/ それが提案されている場所各開発者およびおそらく継続的インテグレーションサーバーは、profiles.xmlファイルでルートディレクトリを構成する必要がありますが、私はそれをソリューションとは見なしません。

それでは、マルチモジュールプロジェクトのルートを簡単に見つける方法はありますか?

Maven 3.3.1以降では、${maven.multiModuleProjectDirectory} この目的のために。 (おかげで https://stackoverflow.com/a/48879554/302789

編集:これは、.mvnプロジェクトのルートにあるフォルダー。

24
Grégory Joseph

つかいます ${session.executionRootDirectory}

記録のために、 ${session.executionRootDirectory}は、Maven 3.0.3のpomファイルで機能します。このプロパティは実行中のディレクトリになるため、親プロジェクトを実行すると、各モジュールはそのルートディレクトリへのパスを取得できます。

このプロパティを使用するプラグイン構成を親pomに配置して、継承されるようにします。親プロジェクトでMavenを実行することがわかっている場合にのみ選択するプロファイルで使用します。この方法では、子プロジェクトでMavenを実行するときに、この変数を望ましくない方法で使用する可能性が低くなります(変数が親へのパスにならないためです)。

たとえば

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-artifact</id>
            <phase>package</phase>
            <goals>
                <goal>copy</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>${project.groupId}</groupId>
                        <artifactId>${project.artifactId}</artifactId>
                        <version>${project.version}</version>
                        <type>${project.packaging}</type>
                    </artifactItem>
                </artifactItems>
                <outputDirectory>${session.executionRootDirectory}/target/</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>
68
anonymous

私のプロジェクトで使用したことは、サブモジュールpomsのプロパティをオーバーライドすることです。

    root:           <myproject.root>${basedir}</myproject.root>
    moduleA:        <myproject.root>${basedir}/..</myproject.root>
    other/moduleX:  <myproject.root>${basedir}/../..</myproject.root>

この方法では、相対パスは引き続き使用できますが、ルートモジュールでプラグインを1回定義するだけで、myproject.rootを適切に置き換えてプラグインを継承できます。

21
Karel Vervaeke

この特定の問題を解決するMavenプラグインがあります。 directory-maven-plugin

プロジェクトのルートパスを選択したプロパティに割り当てます。ドキュメントのhighest-basedir目標を参照してください。

例えば:

<!-- Directory plugin to find parent root directory absolute path -->
<plugin>
  <groupId>org.commonjava.maven.plugins</groupId>
  <artifactId>directory-maven-plugin</artifactId>
  <version>0.1</version>
  <executions>
    <execution>
      <id>directories</id>
      <goals>
        <goal>highest-basedir</goal>
      </goals>
      <phase>initialize</phase>
      <configuration>
        <property>main.basedir</property>
      </configuration>
    </execution>
  </executions>
</plugin>

次に、親/子pom.xmlのどこでも${main.basedir}を使用します。

16
Andrejs

他の人が示唆しているように、directory-maven-pluginが道です。ただし、ここで説明されているように、「directory-of」の目標で最もうまく機能することがわかりました: https://stackoverflow.com/a/37965143/6498617

ネストされたマルチモジュールPOMを使用するマルチモジュールプロジェクトでは、highest-basedirを使用してもうまくいかなかったので、私は好みます。ディレクトリの目標により、プロパティを、もちろんルートを含むプロジェクト全体のモジュールのパスに設定できます。また、$ {session.executionRootDirectory}よりも優れています。ルートまたはサブモジュールを構築するかどうかに関係なく、mvnの現在の作業ディレクトリに関係なく、常に機能するためです。

4
sparkyd

プロジェクト間でファイルをコピーする必要があるため、同様の問題が発生しました。 Mavenが行うことは、リポジトリにインストールされたpom.xmlをハードコードされた値から遠ざけるため、論理的です。

私の解決策は、コピーしたディレクトリをMavenアーティファクトに配置し、Antを使用して抽出/コピーすることでした

2
M.Hoang

別の解決策は、Antタスクを使用して「rootdir = $ {basedir}」をルートプロジェクトのtarget/root.propertiesに書き込み、次に Properties Plugin を使用してそのファイルを読み込むことです。 。自分で試したことはありませんが、うまくいくと思います。

1
neu242

次の小さなプロファイルは私のために働いた。プロジェクトのルートのconfigディレクトリに配置するCheckStyleのこのような構成が必要だったので、メインモジュールとサブモジュールから実行できます。

<profile>
    <id>root-dir</id>
    <activation>
        <file>
            <exists>${project.basedir}/../../config/checkstyle.xml</exists>
        </file>
    </activation>
    <properties>
        <project.config.path>${project.basedir}/../config</project.config.path>
    </properties>
</profile>

ネストされたモジュールでは動作しませんが、異なるexistsを持つ複数のプロファイルを使用して、そのために変更できると確信しています。 (検証タグに "../ .."があり、オーバーライドされたプロパティ自体に ".."があるのはなぜかわかりませんが、そのようにしか機能しません。)

1
Vic

私は、マルチモジュールプロジェクトのルートを見つける「いい」方法を知りません。ただし、現在のアプローチを少し改善することができます。

最初の選択肢は、ルートプロジェクトの直下に追加のモジュールを作成し、すべてのEARをその依存関係として宣言し、 _dependency:copy-dependencies_ を使用してモジュールの依存関係を_to-deploy_ディレクトリ(相対)。はい、パスは依然として相対的ですが、依存関係プラグインの構成が集中化されるので、私はそれを迷惑なものとは思いません。

2番目の代替方法は、 Maven Dependency Plugin の代わりに Maven Assembly Plugin を使用して、dir形式(これにより、ディレクトリに配布が作成されます)。これは実際に私がすることです。

1
Pascal Thivent

そのため、親プロジェクトのプロパティのどこかに、後で関連付ける必要のあるファイルがあります。どこに絶対パスが必要なのですか。だから、私はgroovyの助けを借りてそれを手に入れました:

<properties>    
<source> import Java.io.File; 
        String p =project.properties['env-properties-file']; 
        File f = new File(p); 
        if (!f.exists()) 
        { 
           f = new File("../" + p); 
          if (!f.exists()) 
          { 
             f = new File("../../" + p); 
          } 
        } 
        // setting path together with file name in variable xyz_format 
        project.properties['xyz_format'] =f.getAbsolutePath() 
                            + File.separator 
                            + "abc_format.xml"; 
</source>
</properties>   

そして::

  <properties>
     <snapshots>http://localhost:8081/snapshots<snapshots>
     <releases>http://localhost:8081/releases</releases>
     <sonar>jdbc:Oracle:thin:sonar/sonar@localhost/XE</sonar>
     <sonar.jdbc.username>sonar</sonar.jdbc.username>
     <format.conf> ${xyz_format}</format.conf>  <---- here is it!
    </properties>

できます!

0
Iakov Senatov