🌟

pom.xmlに書かれているmaven pluginをリストで表示する

2024/08/13に公開

mavenのプロジェクトでインストールされているmavenのプラグインをリストで
表示したい。

ここで初めに思いつくのは下記のコマンドを使うことだろう。

mvn dependency:resolve-plugins

しかし、この方法だと以下の問題がある。

  1. 親でインストールされているプラグインも表示される。
  2. pom.xmlに書かれているmaven pluginと依存関係があるプラグインも表示される。

なので、pom.xmlに書かれているプラグイン以外もたくさん表示される。

pom.xmlに書かれているmaven pluginのみを表示する方法はmavenに無い(多分)ので、
頑張ってテキストを整形することになる。

pom.xmlはxml書式のファイルなので、xmlとしてパースすることになる。
検索するとよく使われるのが、xmllintなどのbashやzshで使うこと前提の
コマンドラインアプリケーションだが、ここでは筆者はpowershellを押したい。

powershellのメリットとしてはxmlは階層構造とオブジェクトを表しているので、
bashと違って、sedやgrepなどのシェル芸を強要されないことと、
powershellのオブジェクトという形で管理、途中結果をオブジェクトという形で変数やファイルに出力できるという点だ。

下記は5.1系列でもcore系、linux, macなどwindows以外のプラットフォームでも正しく動きます。

$xml = [xml](Get-Content pom.xml)

# pom.xmlの階層をそのまま使える。
$xml.project.build.pluginManagement.plugins.plugin

下のような出力が得られる。

artifactId                        version
----------                        -------
maven-clean-plugin                3.1.0
maven-resources-plugin            3.0.2
maven-compiler-plugin             3.8.0
maven-surefire-plugin             2.22.1
maven-jar-plugin                  3.0.2
maven-install-plugin              2.5.2
maven-deploy-plugin               2.8.2
maven-site-plugin                 3.7.1
maven-project-info-reports-plugin 3.0.0

ちゃんとXpath使って処理したい場合は次みたいな感じになる。
スクリプトとして残しておく実行するなら下記のように名前空間とxpathを使うことを推奨する。

$xml = [xml](Get-Content pom.xml)
$Namespace = @{
    pom = "http://maven.apache.org/POM/4.0.0"
}

$pluginManagement = Select-Xml -Xml $Xml -XPath "//pom:pluginManagement" -Namespace $Namespaces

# 上と同じ出力が得られる。
$pluginManagement.Node.plugins.plugin

xpathだろうが、そのままプロパティを見ていくことにしようが、Get-Contentして読み込んだ文字列を[xml]を使ってxmlオブジェクトに無理矢理変更している方になるが、
mvn validateなどを事前に実行していて正しい書式だという確証があるならこのやり方の方が手っ取り早い。

Discussion