Eclipse上でのGradle(STS)プラグインの使用

2018年7月13日



※ここを見に来る方が大変に多いのだが、STS(Gradle IDE pack)はおすすめしない、開発は継続されていない。これを受け継ぐと言われるbuildshipも全くおすすめできない。唯一おすすめできるのはEGradleである。EGradleの操作感を参照してほしい。

プラグインのインストールと設定

選択肢がいろいろあるようだが、面倒を避け、marketplaceからGradle IDE packをインストールする。

window/preference->GradleにてGradle DistributionをFolder指定し、生のgradleを回答した場所を指定。
window/preference->Gradle EnIDEにて「Gradle home to use」に同じの解凍場所を指定。

Eclipse上での操作

既存のJavaプロジェクトの変換

既存のJavaプロジェクトをGradleプロジェクトに変換するには、プロジェクト名を右クリックし、コンテキストメニューからConfigure>Convert to Gradle Projectをクリックする。以下の変更が起こる。

  • .projectファイルが書き換えられる。おそらくここでGradleプロジェクトであることが示される。
  • .classpathから個別に追加されていたjarファイルが削除されてしまう。代わりにGradle Dependenciesが挿入される。
  • .settings/gradleというフォルダが作成される。Gradleに関する何らかの設定が格納されるものと思われる。

なぜかソースパスも空になるので、手で設定し直す必要がある。

また、これまでライブラリとして指定されていたjarファイルが削除されてしまう。が、その代わりに後に述べるbuild.gradleファイルの中の依存指定によって自動的に取得されるjarファイルが、Gradle Dependenciesの中に挿入されていく。

なお、変換を行っただけでは、build.gradle(Antのbuild.xmlにあたる)は自動で作成されることはない。これは手で作成する必要がある。

build.gradleの作成と依存ライブラリの追加

依存ライブラリを取得するだけの最も単純なビルドファイルを作成してみる。
当然ながら、CENTRAL_REPOSITORY,INHOUSE_REPOSITORYは先のgradle.propertiesに指定されたものが使用される。

apply plugin: 'java'

repositories {
maven { url CENTRAL_REPOSITORY }
maven { url INHOUSE_REPOSITORY }
}

dependencies {
compile 'commons-logging:commons-logging:1.2'
}

これを作成した後、「プロジェクト名」を再度右クリックし、Gradle>Refresh Dependenciesを選択すると、必要なライブラリがリポジトリから取得され、それが先の「マシン全体キャッシュ」の中に保存され、さらに、このプロジェクトのライブラリのGradle Dependenciesにリストされる。そして、このjarファイルのパスを確認すると、「マシン全体キャッシュ」の中のパスを示していることがわかる。

つまり、複数のプロジェクトで同じjarファイルを使用しても、それらのjarはプロジェクトごとに格納されるのではなく、「マシン全体キャッシュ」の中にただ一つだけ存在することになる。

依存ライブラリの増減があった場合は、再度Gradle>Refresh Dependenciesを行えば勝手にライブラリを更新してくれる。ただし、ライブラリ(アーティファクトという)の指定を間違えた場合、

dependencies {
compile 'commons-abc123:commons-logging:1.2'
}

コンソールには何もエラーが表示されず、Problemsにエラー内容が表示されることに注意。

Gradle GUIの利用

build.gradleは、antのbuild.xmlと異なり、eclipseのoutlineビューにはタスク一覧が表示されない。その代わりに、Gradle GUIを使用する。

build.gradleを右クリックし、コンテキストメニューからRun As > Gradle GUIを選択すると、Gradleのコントロール画面が表示される。

Task Treeタブには、build.gradleの中の実行可能なタスク(antで言うターゲット)が一覧される。いずれかをダブルクリックすることで実行できる。

必要なタスク(ターゲット)をすべて記述しなければならないantとは異なり、gradleの場合にはデフォルトのタスクがあらかじめ複数用意されている。例えば、buildタスクはプロジェクトのビルドを行うタスクであるが、ただしこれは「gradleの想定するソース配置にのっとっている場合」にのみうまく動作する。例えば、javaソースはsrc/main/java以下になければならない。

そうでない場合には、適宜build.gradleにてソース位置などを指定する必要がある。

Gradle GUIのトラブル

勝手に作成されるgradle-app.settingというファイルを参照するのだが、ここにおかしな設定があるとGUI自体の起動ができなくなる。
事前に消してしまった方がよい。

完全なbuild.gradleの例

以下はあるプロジェクトのほぼ完全なbuild.gradleの例である。
このプロジェクトでは、セントラルリポジトリから必要な公開ライブラリを取得し、コンパイルを行い、インハウスリポジトリにビルド結果を登録する。
記述中には現れないが、自動的にpublishTargetPublicationToMavenRepositoryというタスクが生成されており、このタスクを実行すると、ビルドと登録を自動で行ってくれる。

なお、ソース位置はgradleの想定するsrc/main/javaではなく、src以下にあり、リソースもこのツリーに含まれており、さらに*Test.javaというソースはユニットテストであるためビルドには含めない。
また、別途ソースjarは作成せず、classと同じjarにソースも格納する。

apply plugin: 'java'
apply plugin: 'maven-publish'

// グループ指定
group = "jp.foobar"

// このプログラムの現在のバージョン
version = 1.0

// 全ソースがUTF-8であることを指定する
//[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
tasks.withType(JavaCompile) {
  options.encoding = 'UTF-8'
}

// Javaソースのバージョン
sourceCompatibility = 1.8

// 生成クラスのバージョン
targetCompatibility = 1.8

// 依存を取得する場合のリポジトリ
repositories {
  maven {
    url CENTRAL_REPOSITORY
  }
  maven {
    url INHOUSE_REPOSITORY
  }
}

// classのみではなく、ソース入りのjarを生成すること
jar {
  from sourceSets.main.allSource
}


// 公開設定
publishing {
  publications {
    target(MavenPublication) {
      from components.java    
    }
  }  
  repositories {
    maven {
      url INHOUSE_REPOSITORY
      credentials {
        username = INHOUSE_USER
        password = INHOUSE_PASSWORD
      }           
    }
  }  
}

// ソースセットの指定
sourceSets {
  main {
    java {
      srcDir 'src'
      exclude '**/*Test.java'
    }
    resources {
      srcDir 'src'
      exclude '**/*Test.java'
    }
  }
}

// このプロジェクトの依存ライブラリの指定
dependencies {
    compile group: 'javax.inject', name: 'javax.inject', version: '1'
    compile(group: 'com.google.inject', name: 'guice', version: '3.0') {
      exclude module:'asm'
      exclude module:'aopalliance'
      exclude module:'cglib'
    }
    compile group: 'com.google.guava', name: 'guava', version: '18.0'    
    testCompile group: 'org.mockito', name: 'mockito-all', version: '1.9.0'
}

タスクの実行

ビルドを行うタスクのほかに、スクリプト(build.gradle)に指定された構造を表示するコマンドがある。引数付きのコマンドは「Task Tree」タブからは実行できず、「Command Line」から実行する必要がある。

  • tasks –all 全タスクとタスク間の依存関係を表示する。