Usual Software Engineer

よくあるソフトウェアエンジニアのブログ

Gradleでdependencies無しの独自pom.xmlを生成する

小ネタです。
GradleでJavaのプロジェクトを作成する時に、何らかの理由でpom.xmlを生成したい時があるかと思います。
僕の場合はDroolsのWorkbenchにjarをアップロードするためにそのjarに独自のpom.xmlを含めたかったのですが、それにはちょっとしたテクニックが必要でした。
単純に作ったjarをmavenレポジトリにアップロードしたいだけならmaven-publish pluginを使うことでそれが可能ですが、
今回は独自のpom.xmlを生成することに着目したいと思います。

まずはGradleの設定を考慮してpom.xmlとして生成したい場合です。このように build.gradle に記述します。

...
project('dummy-project-01') {
    apply plugin: 'maven'

    task writeNewPom {
        pom {
            project {
                inceptionYear '2008'
                licenses {
                    license {
                        name 'The Apache Software License, Version 2.0'
                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                        distribution 'repo'
                    }
                }
        }.writeTo("$buildDir/newpom.xml")
    }

    dependencies {
        ...
    }
}
...

公式ドキュメントにも載っているので、ググれば簡単にたどり着けるかもしれません。
The Maven Plugin - Gradle User Guide Version 3.3
pom.xmlの中身を自由に定義でき、dependenciesの内容も自動で書き込んでくれます。

ここで疑問となるのが、「dependenciesはいじることができないの…?」という部分です。
dependenciesを追加することは、上記のlicensesのように記述すれば可能なのですが
dependenciesを消すことができません。。そんなときは次のように記述します。

...
project('dummy-project-02') {
    apply plugin: 'maven'

    task writeNewPom << {
        pom {}.whenConfigured {
            pom -> pom.dependencies.clear()
        }.writeTo("$buildDir/resources/main/META-INF/maven/$project.group/$project.name/pom.xml")
    }
    processResources.dependsOn writeNewPom

    dependencies {
        ...
    }
}
...

pom.dependencies はListなので clear() で空にすることができます。力技な感じはするのでドキュメントには載っていないはず。
dependenciesの操作とは関係がありませんが、processResourcesにdependsOnで依存関係を定義しているため、
いつも通り gradle assemble とか gradle build するだけでprocessResourcesの実行前にwriteNewPomのタスクを実行してくれます。
またwriteToで指定の場所に出力が可能なので、これでjarの中に自分好みのpom.xmlを含めることができます。以上小ネタでした。

いまだにmavenプロジェクトなOSSのプロダクトも多いと思いますが、Gradleに慣れたらだんだんpom恐怖症になります。
最近はもうGradle Kotlin Scriptを使っている人も多いのでしょうか。Kotlinも触らないとなーと思う今日このごろでした。