GradleでMavenリポジトリにデプロイする時のメモ

しばらく書いていないと忘れてしまうのでメモ。
Gradle(Groovy)なので柔軟に書けちゃうので、これが正解というわけではないです。

基本的な設定

java, mavenプラグインを設定する。

apply plugin: 'java'
apply plugin: 'maven'

pom.xmlのgroupId、artifactId、versionの元ネタを設定する。archiveBaseNameは省略可能。その場合、プロジェクトのフォルダ名が使われる(参考)。archivesBaseNameの代わりに、jar.baseName でもOK。

group = 'com.github.wadahiro'
archivesBaseName = 'maven-upload-sample' 
version = '1.0'

uploadArchivesタスクを設定する。

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: 'file:/path/to/myrepo')
        }
    }
}

これで、gradle uploadArchivesを実行すると/path/to/myrepo 以下にmaven-upload-sample-1.0.jarがデプロイされるようになる。

HTTPでリポジトリにデプロイする

URLをhttp://〜に変更する。

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: 'http://mycompany/content/repositories/thirdparty')
        }
    }
}

認証付きの場合は以下のようにする。MavenリポジトリにNexusを使うとデフォルトで認証付きなので以下のようにauthenticationでユーザーID・パスワードを設定する。

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: 'http://mycompany/content/repositories/thirdparty') {
                authentication(userName: "admin", password: "admin123")
            }
        }
    }
}

ソースファイル、JavaDocもアップロードする

まず以下のタスクを追加し、*-sources.jar・*-javadoc.jarが生成されるようにする。

task sourcesJar(type: Jar, dependsOn:classes) {
     classifier = 'sources'
     from sourceSets.main.allSource
}

task javadocJar(type: Jar, dependsOn:javadoc) {
     classifier = 'javadoc'
     from javadoc.destinationDir
}

さらに、これらをartifactとして認識させるために、archiveタスクで定義したsourcesJar・javadocJarを指定する。
artifactについて詳細はChapter 44. Publishing artifactsを参照のこと。

artifacts {
     archives sourcesJar
     archives javadocJar
}

これで、gradle uploadArchivesを実行すると*-sources.jar・*-javadoc.jarが生成され、リポジトリにデプロイされるようになる。

POMのプロジェクト情報を設定する

Mavenだとpom.xmlにライセンスなどプロジェクトの情報を記述できるようになっています。gradleからもこれらは設定は可能。
以下のように書いておくと、gradle uploadArchivesによるデプロイ、gradle installによるローカルMavenリポジトリ($HOME/.m2/repository)へのインストール時に生成されるpom.xmlに反映されるようです。
ちょっと長ったらしいのでもっと良い書き方がないか探索中...

[install.repositories.mavenInstaller, uploadArchives.repositories.mavenDeployer]*.pom*.whenConfigured { pom ->
    pom.project {
        inceptionYear '2012'
        packaging 'jar'
        licenses {
            license {
                name 'The Apache Software License, Version 2.0'
                url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                distribution 'repo'
            }
        }
    }
}

POMの依存関係

build.gradleで設定した依存関係は、自動生成されるpom.xmlにも自動反映される。
依存関係の制御については別途書く予定。

最終的なbuild.gradle

apply plugin: 'java'                                                                                                                             
apply plugin: 'maven'

group = 'com.github.wadahiro.gradle-samples'
archivesBaseName = 'maven-upload-sample'
version = '1.0'

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: 'file:/path/to/myrepo')
        }
    }
}

task sourcesJar(type: Jar, dependsOn:classes) {
     classifier = 'sources'
     from sourceSets.main.allSource
}

task javadocJar(type: Jar, dependsOn:javadoc) {
     classifier = 'javadoc'
     from javadoc.destinationDir
}

artifacts {
     archives sourcesJar
     archives javadocJar
}

[install.repositories.mavenInstaller, uploadArchives.repositories.mavenDeployer]*.pom*.whenConfigured { pom ->
    pom.project {
        inceptionYear '2012'
        packaging 'jar'
        licenses {
            license {
                name 'The Apache Software License, Version 2.0'
                url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                distribution 'repo'
            }
        }
    }
}