Blog

gradle で maven central にあげる

ちょっと前に gradle で maven central にあげようとしたら極めて困難な印象で挫折していたのだが、最近試したらすんなりといったのでご報告申し上げます。

単に gradle が難しいというよりは、maven central 等の toolchain 的な部分に関する知識がだいたいわかったので、すんなりわかったという点も多いんですが。

まず、gradle に maven central にアップロードする方法は、実は公式サイトにまとめられています。 http://central.sonatype.org/pages/gradle.html

基本的にはこの通りに設定すればいいのだが、このドキュメント、gnupg とかについてはすでに設定済みだ、というような前提に基づいているので注意が必要。

アカウントの取得等についてはモリスさんのエントリを読めばよろしい。 http://tagomoris.hatenablog.com/entry/20141028/1414485679

で、GPG 鍵の設定についてはこのへん参考にすればよい。 http://int128.hatenablog.com/entry/20130409/1365434513

で、gradle の設定については、基本的には gradle init と打てばなんとなくマイグレーションが行われる。gradle init しても maven central 関連のデータが出来上がるわけではまったくないことに注意すべき。

必要な設定については http://central.sonatype.org/pages/gradle.html の公式ドキュメントに載っている通りなのだが、いくつか変更してる。

具体的には

といったところを変更している。

apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'signing'
apply plugin: 'findbugs'
apply plugin: 'checkstyle'

group = 'me.geso'
archivesBaseName = "regexp-trie"
version = '0.1.11-SNAPSHOT'

description = """regexp-trie"""

[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
sourceCompatibility = 1.7
targetCompatibility = 1.7

repositories {
     maven { url "http://repo.maven.apache.org/maven2" }
}

dependencies {
    testCompile group: 'junit', name: 'junit', version:'4.11'
}

findbugsMain {
  ignoreFailures = false
  effort = "max"
}

task javadocJar(type: Jar) {
    classifier = 'javadoc'
    from javadoc
}

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

artifacts {
    archives javadocJar, sourcesJar
}

signing {
    sign configurations.archives
}

try {
  uploadArchives {
    repositories {
      mavenDeployer {
        beforeDeployment {
          MavenDeployment deployment -> signing.signPom(deployment)
        }

        repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") {
          authentication(userName: ossrhUsername, password: ossrhPassword)
        }

        snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/") {
          authentication(userName: ossrhUsername, password: ossrhPassword)
        }

        pom.project {
          name 'regexp-trie'
          packaging 'jar'
          // optionally artifactId can be defined here 
          description 'Trie based regexp generator'
          url 'http://github.com/tokuhirom/regexp-trie/'

          scm {
            url 'https://github.com/tokuhirom/regexp-trie/'
            connection 'scm:git:git://github.com/tokuhirom/regexp-trie.git'
            developerConnection 'scm:git:[email protected]:tokuhirom/regexp-trie.git'
          }

          licenses {
            license {
              name 'MIT License'
              url 'http://www.opensource.org/licenses/mit-license.php'
            }
          }

          developers {
            developer {
              id 'tokuhirom'
              name 'Tokuhiro Matsuno'
              email '[email protected]'
            }
          }
        }
      }
    }
  }
} catch (MissingPropertyException mpe) {
  if (System.env['CI']) {
    println("Run on CI");
  } else {
    throw mpe;
  }
}

ossrhPassword などの設定は、~/.gradle/gradle.properties に書く。

org.gradle.daemon=true

signing.keyId=MY_KEY_ID
signing.password=GPG_KEY_PASSPHRASE
signing.secretKeyRingFile=/path/to/.gnupg/secring.gpg

ossrhUsername=MY_JIRA_ID
ossrhPassword=MY_JIRA_PASSWORD

checkstyle の設定は config/checkstyle/checkstyle.xml に置く。 このルールは、普段使っているルールからパッケージ名の宣言等を抜いたもの。

<property name="severity" value="error"/>

とすることにより、すべてのルールをエラーレベルにしている。 開発時にコーディングルールを順守しないコードをマージしてもろくなことがないので、エラーレベルにしておくのが良い。

そして、travis ci の設定もカエル。簡単。travis の設定としてはほぼ一緒だが gradlew を実行しているところが違う。 また、teppeis さんのエントリを参考に、sudo を false にしている。 このフラグ変更により、コンテナで実行されるようになり、圧倒的に早く処理が開始されるようになる。 また、~/.gradle/ をキャッシュする設定をいれることにより、gradlew が毎回ダウンロードしなくなるので実行が速くなる。

language: java
sudo: false
jdk:
  - oraclejdk8
install: ./gradlew check
cache:
  directories:
    - $HOME/.gradle/

ちょっと前に調べた時は、maven central にあげるための workaround みたいなものを無限にしろ! って書いてある記事が多くて萎えてやめたのだが、今や普通に使えるようだ。

2015-04-30 追記

正直、ウェブアプリの開発では、開発ツールなどを invoke するために gradle にすることに意味があるが、一般的な java library の開発では maven で十分だと思う。