カスタムmaven2MOJOを書いています。このMOJOから別のプラグインのランタイム構成にアクセスする必要があります。
これを行うための最良の方法は何ですか?
カスタムmaven2MOJOを書いています。このMOJOから別のプラグインのランタイム構成にアクセスする必要があります。
これを行うための最良の方法は何ですか?
次の手順を使用して、ビルドで現在使用されているプラグインのリストを取得できます。
まず、現在のプロジェクトをモジョに挿入するために Maven を取得する必要があります。これを取得するには、以下で定義されているクラス変数を使用します。
/**
* The maven project.
*
* @parameter expression="${project}"
* @readonly
*/
private MavenProject project;
次に、以下を使用して、このビルドで使用されているプラグインのリストを取得できます。
mavenProject.getBuildPlugins()
設定を抽出したいプラグインが見つかるまで、このリストを反復できます。
最後に、構成を Xpp3Dom として取得できます。
plugin.getConfiguration()
注: (単に情報を抽出するのではなく) 他のプラグイン構成を変更する場合、現在のフェーズでのみ変更されたままになり、後続のフェーズでは変更されません。
プロパティを使用することは確かに 1 つの方法ですが、理想的ではありません。ユーザーは、pom の複数の場所で ${propertyName} を定義する必要があります。プラグイン定義自体を除いて、ユーザーの pom を変更せずにプラグインが動作できるようにしたいと考えています。
別の MOJO のランタイム プロパティにアクセスすることは、結合が強すぎるとは思いません。他の MOJO がビルド階層のどこかに定義されている場合、私の MOJO が同じ構成を尊重するようにします。
私の現在の解決策は次のとおりです。
private Plugin lookupPlugin(String key) {
List plugins = getProject().getBuildPlugins();
for (Iterator iterator = plugins.iterator(); iterator.hasNext();) {
Plugin plugin = (Plugin) iterator.next();
if(key.equalsIgnoreCase(plugin.getKey())) {
return plugin;
}
}
return null;
}
/**
* Extracts nested values from the given config object into a List.
*
* @param childname the name of the first subelement that contains the list
* @param config the actual config object
*/
private List extractNestedStrings(String childname, Xpp3Dom config) {
final Xpp3Dom subelement = config.getChild(childname);
if (subelement != null) {
List result = new LinkedList();
final Xpp3Dom[] children = subelement.getChildren();
for (int i = 0; i < children.length; i++) {
final Xpp3Dom child = children[i];
result.add(child.getValue());
}
getLog().info("Extracted strings: " + result);
return result;
}
return null;
}
これは、私がテストしたいくつかの小さなビルドで機能しました。マルチモジュールビルドを含みます。
正確な方法はわかりませんが、これは最善の設計上の決定ではないように思えます。可能であれば、Mojo を他のプラグインから分離することを目指すべきです。
代わりに、カスタム プロパティを使用して、個別のプラグインの構成における重複を除外することをお勧めします。
プロパティセクションを使用して、pom にカスタムプロパティ「foo」を設定できます。
<project>
...
<properties>
<foo>value</foo>
</properties>
...
</project>
プロパティ foo は、ドル記号 + 中括弧表記を使用して、pom のどこからでもアクセスできるようになりました。
<somePluginProperty>${foo}</somePluginProperty>