Locked History Actions

Diff for "gradle"

Differences between revisions 18 and 19
Deletions are marked like this. Additions are marked like this.
Line 118: Line 118:

== 完全な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
      artifactId 'd_gxt3.1'
    }
  }
  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'
}

}}}

gradle

eclipse上の開発において、これまでのantをgradleに変更する。antでの依存解決はivyを使用するのが通例だが、これは行ってこなかった。 gradleは、ビルドと共に依存解決・管理も行ってくれる。リポジトリとしてはartifactoryを使用することにする。

gradleのインストール(eclipseプラグイン含む)

gradle本体のインストール

https://services.gradle.org/distributions からgradle-2.5-all.zipをダウンロードし、適当な場所に解凍する。

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

eclipse marketplaceでgradleを検索し、gradle IDE packをインストール。

window/preference->GradleにてGradle DistributionをFolder指定し、先の解凍場所を指定 window/preference->Gradle EnIDEにて「Gradle home to use」に先の解凍場所を指定

キャッシュファイルと設定ファイル

マシン全体のキャッシュファイルと設定ファイル

gradleにて何らかの動作を行うと以下の場所に勝手にキャッシュファイルが作成される(windowsの場合)。

c:\users\ユーザ名\.gradle

この下にcaches,daemon,nativeというフォルダが作成されるが、特に重要なのはcachesで、ここにリポジトリから取得したアーティファクト(jarと依存関係を記述したファイル)がキャッシュされる。リポジトリとの整合性が無くなるなどした場合には、いつでも削除してしまってよい。必要な場合には再度勝手に構築される。

また、gradle.propertiesという設定ファイルを作成して、そこにプロパティ値を書き込んでおくことにより、作業中の全プロジェクトについてのこれらの設定値を一度に変更することができる。

c:\users\ユーザ名\.gradle\gradle.properties

例えばここには以下のように記述する。この例は192.168.177にてartifactoryを動作させており、それをセントラルリポジトリのキャッシュとしても、インハウスリポジトリとしても使用する場合。

CENTRAL_REPOSITORY=http://192.168.1.177:8081/artifactory/libs-release
INHOUSE_REPOSITORY=http://192.168.1.177:8081/artifactory/libs-release-local
INHOUSE_USER=admin
INHOUSE_PASSWORD=password

後ほど述べるbuild.gradleにこれらのプロパティ値を指定することになる。

プロジェクトごとのキャッシュファイルと設定ファイル

build.gradleと同じフォルダに以下が勝手に作成される。これはバージョン管理に格納する必要はない。

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にてソース位置などを指定する必要がある。

完全な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  
      artifactId 'd_gxt3.1'    
    }
  }  
  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'
}