81

Gradle のようなマルチモジュール Maven プロジェクトのルートを見つける簡単な方法はありますrootDirか?


バックグラウンド:

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

つまり、私のレイアウトは次のように見えますが、名前が変更されています。

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

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

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

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

        <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>jar</type>
                                <outputDirectory>../../to-deploy</outputDirectory>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </execution>
            </executions>
        </plugin>

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

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

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

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

しかし${myproject.root}、モジュールPOMで使用しようとすると、モジュール${basedir}のbasedirに解決されます。

また、各開発者とおそらく継続的統合サーバーは、profiles.xml ファイルでルート ディレクトリを構成する必要がありますが、私はそれを解決策とは考えていません。

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

4

15 に答える 15

77

使用する${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>
于 2011-10-06T15:30:02.500 に答える
28

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

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

この方法でも相対パスを使用できますが、ルート モジュールで一度プラグインを定義すると、モジュールは myproject.root を適切に置換してプラグインを継承します。

于 2012-01-13T09:07:22.357 に答える
22

この特定の問題を解決する 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>

次に${main.basedir}、親/子 pom.xml の任意の場所で使用します。

于 2013-11-28T11:16:44.713 に答える
7

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

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

于 2016-06-22T10:35:34.587 に答える
3

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

<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。(検証タグに「../..」があり、オーバーライドされたプロパティ自体に「..」が必要な理由はわかりませんが、その方法でのみ機能します。)

于 2013-07-02T10:44:55.250 に答える
2

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

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

于 2012-06-06T10:34:24.847 に答える
1

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

最初の方法は、ルートプロジェクトのすぐ下に追加のモジュールを作成し、その中の依存関係としてすべてのEARを宣言し、モジュールの依存関係をディレクトリに(比較的)dependency:copy-dependenciesコピーするために使用することです。to-deployはい、パスは引き続き相対的ですが、依存関係プラグインの構成が一元化されるため、それほど煩わしいとは思いません。

2番目の方法は、 Maven依存関係プラグインの代わりにMavenアセンブリプラグインを使用して、 dir形式を使用してディストリビューションを作成することです(これにより、ディレクトリにディストリビューションが作成されます)。これは実際に私がすることです。

于 2010-06-21T14:04:35.130 に答える
1

別の解決策は、antタスクを使用してルートプロジェクトのtarget /root.propertiesに「rootdir=$ {basedir}」を書き込み、プロパティプラグインを使用してそのファイルを読み戻すことです。私は試していません。私自身、しかし私はそれがうまくいくはずだと思います..?

于 2010-12-14T11:18:39.743 に答える
0

そのため、親プロジェクトのプロパティのどこかに、後で関連付ける必要があるファイルがあります。そのため、どこにでも絶対パスが必要です。だから、私は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>

できます!

于 2016-03-26T14:25:25.653 に答える