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
プロジェクトのルートにあるフォルダー。
${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>
私のプロジェクトで使用したことは、サブモジュールpomsのプロパティをオーバーライドすることです。
root: <myproject.root>${basedir}</myproject.root>
moduleA: <myproject.root>${basedir}/..</myproject.root>
other/moduleX: <myproject.root>${basedir}/../..</myproject.root>
この方法では、相対パスは引き続き使用できますが、ルートモジュールでプラグインを1回定義するだけで、myproject.rootを適切に置き換えてプラグインを継承できます。
この特定の問題を解決する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}
を使用します。
他の人が示唆しているように、directory-maven-pluginが道です。ただし、ここで説明されているように、「directory-of」の目標で最もうまく機能することがわかりました: https://stackoverflow.com/a/37965143/6498617 。
ネストされたマルチモジュールPOMを使用するマルチモジュールプロジェクトでは、highest-basedirを使用してもうまくいかなかったので、私は好みます。ディレクトリの目標により、プロパティを、もちろんルートを含むプロジェクト全体のモジュールのパスに設定できます。また、$ {session.executionRootDirectory}よりも優れています。ルートまたはサブモジュールを構築するかどうかに関係なく、mvnの現在の作業ディレクトリに関係なく、常に機能するためです。
プロジェクト間でファイルをコピーする必要があるため、同様の問題が発生しました。 Mavenが行うことは、リポジトリにインストールされたpom.xmlをハードコードされた値から遠ざけるため、論理的です。
私の解決策は、コピーしたディレクトリをMavenアーティファクトに配置し、Antを使用して抽出/コピーすることでした
別の解決策は、Antタスクを使用して「rootdir = $ {basedir}」をルートプロジェクトのtarget/root.propertiesに書き込み、次に Properties Plugin を使用してそのファイルを読み込むことです。 。自分で試したことはありませんが、うまくいくと思います。
次の小さなプロファイルは私のために働いた。プロジェクトのルートの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
を持つ複数のプロファイルを使用して、そのために変更できると確信しています。 (検証タグに "../ .."があり、オーバーライドされたプロパティ自体に ".."があるのはなぜかわかりませんが、そのようにしか機能しません。)
私は、マルチモジュールプロジェクトのルートを見つける「いい」方法を知りません。ただし、現在のアプローチを少し改善することができます。
最初の選択肢は、ルートプロジェクトの直下に追加のモジュールを作成し、すべてのEARをその依存関係として宣言し、 _dependency:copy-dependencies
_ を使用してモジュールの依存関係を_to-deploy
_ディレクトリ(相対)。はい、パスは依然として相対的ですが、依存関係プラグインの構成が集中化されるので、私はそれを迷惑なものとは思いません。
2番目の代替方法は、 Maven Dependency Plugin の代わりに Maven Assembly Plugin を使用して、dir形式(これにより、ディレクトリに配布が作成されます)。これは実際に私がすることです。
そのため、親プロジェクトのプロパティのどこかに、後で関連付ける必要のあるファイルがあります。どこに絶対パスが必要なのですか。だから、私は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>
できます!