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も触らないとなーと思う今日このごろでした。