Gradle はAndroid Atudio のビルドツールとして採用されるなど、次世代のビルドツールとして注目されている。
ビルド用のスクリプトは GroovyのDSL で簡潔に記述することができる一方で、複雑な箇所は Groovyスクリプトで記述する事も可能。
CoC(設定を超える規約)に則っており、規約に従う事によってビルドスクリプト記述量が大幅に削減できるうえに、
デフォルト設定の上書きも可能な為、規約にハマらない場合にも対応可能となっている。
※フォルダ構成等の規約は 基本的に Maven と同じ。
(1) 公式サイトのDOWNLOADS からGradleをダウンロード
http://gradle.org/gradle-download/
(2) ダウンロードしたzipを解凍し、環境変数 GRADLE_HOME に解凍したディレクトリのPATHを設定する
(3) GRADLE_HOME/bin にPATHを通す
gradle init --type java-library
type には pom、java-application、java-library、scala-library、groovy-library、groovy-application、basic などが指定できる。
※ https://docs.gradle.org/current/userguide/build_init_plugin.html
規約に従ったディレクトリ構成の場合は、ビルドスクリプトの大幅な記述量削減が可能となる。
ただし Maven と違い、記述を加える事によって規約に合わないディレクトリ構成でもビルドが可能となっている。
以下、Gradleが期待するディレクトリ構成(Mavenと同じ)
プロジェクトルート
+--- build.gradle(ビルドスクリプト)
+--- src
+--- main
| +--- java
| +--- resources(propertiesファイルなど)
| +--- config
| +--- webapp (webアプリの場合)
| +--- WEB-INF
| +--- classes
| +--- lib
| +--- web.xml
|
+--- test
+--- java
+--- resources
"gradle" に続けてタスク名を入力する事で、該当のタスクを実行する事ができる
gradle init --type java-library
以下、主なタスクの一覧(他、詳細は後述)
| タスク | 説明 | 実行例 |
| init | プロジェクトを作成する | gradle init --type java-library gradle init --type java-application |
| assemble | コンパイルを実行しJAR、WAR、ZIP、TARファイルなどを作る | |
| build | assemble後にテストを実行する | |
| buildDependents | そのプロジェクト“が”依存するプロジェクトを含めbuildを実行する | |
| classes | メインクラスをassembleする | |
| clean | 成果物(buildディレクトリ配下)を削除する | |
| compileJava | プロダクトのコンパイルを行う | |
| compileTestJava | テストコードをコンパイルする | |
| jar | メインクラスを含むJarファイルを作成する | |
| processResources | プロダクトのリソースをクラスディレクトリにコピーする | |
| processTestResources | テストリソースをテストクラスディレクトリにコピーする | |
| testClasses | テストクラスをassembleする | |
| uploadArchives | 成果物をアップロードする | |
| tasks | 実行可能なタスクを確認する |
apply plugin: 'java'
// In this section you declare where to find the dependencies of your project
repositories {
jcenter()
}
jar {
manifest {
// net.magata.example.TestMain をメインクラスとする場合
attributes 'Main-Class': 'net.magata.example.TestMain'
}
}
dependencies {
compile 'グループID:アーティファクトID:バージョン'
// Use JUnit test framework
testImplementation 'junit:junit:X.XX'
}
簡単なタスクを作成し、実行してみる
適当なディレクトリを作成し、配下に以下のファイルを作成する。(ファイル名:build.gradle)
task hello {
doLast {
println "hello!"
}
}
ショートカット記法を使用する場合
task hello << {
println "hello!"
}
./gradlew hello
結果:
:hello hello! BUILD SUCCESSFUL Total time: 2.415 secs
task myTask1 {
doLast {
println "This is myTask1"
}
}
task myTask2(dependsOn: myTask1) {
doLast {
println "This is myTask2"
}
}
実行
./gradlew myTask2 > Task :myTask1 This is myTask1 > Task :myTask2 This is myTask2 BUILD SUCCESSFUL in 0s
task myTask1 {
doLast {
println "This is myTask1"
}
}
myTask1.doLast {
print "After myTask1"
}
実行
./gradlew myTask1 > Task :myTask1 This is myTask1 After myTask1 BUILD SUCCESSFUL in 0s
build.gradle
apply plugin: 'java' apply plugin: 'application'
または
plugins {
id 'java'
id 'application'
}
build.gradle
defaultTasks 'タスク名1' 'タスク名2'
run {
if (project.hasProperty('args')) {
args project.args.split('\\s+')
}
}
実行例
./gradlew run -Pargs="arg1 arg2"
build.gradle
applicationDefaultJvmArgs = ["-Xms1024m", "-Xmx1024m"]
※http://gradle.monochromeroad.com/docs/userguide/application_plugin.html
関連: JavaVMのチューニングメモ
./gradlew run 時に実行するメインクラスを指定する
mainClassName = "org.gradle.sample.Main"
apply plugin: 'java' sourceCompatibility = '1.8' targetCompatibility = '1.8'
compileJava.options.encoding = 'UTF-8' compileTestJava.options.encoding = 'UTF-8'
run {
// 引数で指定されたクラスを実行する
if (project.hasProperty('main')) {
main(project.main)
}
}
実行例
./gradlew run -Pmain="TestApp1"
※TestApp1.java の main メソッドが実行される。
test {
testLogging.showStandardStreams = true
}