【Gradle 4.0 版】プロジェクト作成時に便利な Build Init Plugin

Gradle 4.0 向けに以下の記事の更新版です。

blog1.mammb.com

試験的な提供なので将来が計画されていますが、Gradle 4.0 時点でどのようなになるかメモしておきます。

Build Init Plugin

Build Init Plugin を使うと Gradle build プロジェクトの作成をタイプに応じて自動でやってくれます。

タイプ タイプ指定
basic $ gradle init
java-application $ gradle init --type java-application
java-library $ gradle init --type java-library
groovy-application $ gradle init --type groovy-application
groovy-library $ gradle init --type groovy-library
scala-library $ gradle init --type scala-library
pom $ gradle init --type pom

basic

タイプ指定なしで basic 指定とみなされます。

$ gradle init

ディレクトリはこんな状態になります。

f:id:Naotsugu:20170801001717p:plain

build.gradle は以下の内容で生成されます。

/*
 * This build file was generated by the Gradle 'init' task.
 *
 * This generated file contains a commented-out sample Java project to get you started.
 * For more details take a look at the Java Quickstart chapter in the Gradle
 * user guide available at https://docs.gradle.org/4.0.2/userguide/tutorial_java_projects.html
 */

/*
// Apply the java plugin to add support for Java
apply plugin: 'java'

// In this section you declare where to find the dependencies of your project
repositories {
    // Use 'jcenter' for resolving your dependencies.
    // You can declare any Maven/Ivy/file repository here.
    jcenter()
}

// In this section you declare the dependencies for your production and test code
dependencies {
    // The production code uses the SLF4J logging API at compile time
    compile 'org.slf4j:slf4j-api:1.7.24'

    // Declare the dependency for your favourite test framework you want to use in your tests.
    // TestNG is also supported by the Gradle Test task. Just change the
    // testCompile dependency to testCompile 'org.testng:testng:6.8.1' and add
    // 'test.useTestNG()' to your build script.
    testCompile 'junit:junit:4.12'
}
*/

java ライブラリプロジェクトの設定で、すべてコメントアウトされています。

ちなみに、repositories は jcenter() がデフォルトですが、Gradle 4 からはGoogle の Maven リポジトリが以下のように簡単に追加できるようになっています。

repositories {
    google()
}

java-application

Java アプリケーションの場合は java-application を使います。

$ gradle init --type java-application

ディレクトリはこんな状態になります。

f:id:Naotsugu:20170801001741p:plain

build.gradle は以下の内容で生成されます。

apply plugin: 'java'
apply plugin: 'application'

repositories {
    jcenter()
}

dependencies {
    compile 'com.google.guava:guava:21.0'
    testCompile 'junit:junit:4.12'
}

mainClassName = 'App'

java プラグインの依存関係定義は以下があります。

configuration名 説明
compile プロジェクトのプロダクトコードをコンパイルするのに必要な依存関係
compileOnly プロジェクトのプロダクトコードをコンパイル時だけ必要な依存関係。runtime には含まれない
runtime プロダクトのクラスを実行するときに必要になる依存関係。デフォルトで、compileの依存関係もここに含まれる
testCompile プロジェクトのテストコードをコンパイルするのに必要な依存関係。デフォルトで、コンパイルされたプロダクトクラスと、コンパイル時の依存関係も含まれる
testCompileOnly プロジェクトのテストコードをコンパイル時だけ必要な依存関係
testRuntime テストを実行するのに必要な依存関係。デフォルトで、compile、runtime、testCompileの各依存関係もここに含まれる

テストフレームワークを変更したい場合は以下のように指定することもできます。

$ gradle init --type java-application --test-framework spock

java-library

Java ライブラリの場合は java-library タイプを使います。

$ gradle init --type java-library

ディレクトリはこんな状態になります。

f:id:Naotsugu:20170801001800p:plain

build.gradle は以下の内容で生成されます。

apply plugin: 'java-library'

repositories {
    jcenter()
}

dependencies {
    api 'org.apache.commons:commons-math3:3.6.1'
    implementation 'com.google.guava:guava:21.0'
    testImplementation 'junit:junit:4.12'
}

java-library プラグインの依存関係定義は以下があります。

configuration名 説明
api 外部(このライブラリの利用者)に公開する依存関係
implementation 外部(このライブラリの利用者)に公開せず、ライブラリ内の実装でのみ使う依存関係
compileOnly コンパイル時にのみ必要となる依存関係(実行時にリークしてはならないもの)
runtimeOnly コンパイル時には不要だが、実行時に必要な依存関係
testImplementation テストをコンパイルするために使用される依存関係
testCompileOnly テストコンパイル時にのみ必要となる依存関係(実行時にリークしてはならないもの)
testRuntimeOnly テストランタイムでのみ必要となる依存関係

ライブラリは、公開APIのパラメータで必要な型やアノテーションといった、公開APIを利用する上で必要となる依存を ABI (Application Binary Interface) と呼び、この api と内部実装である implementation を区別して依存定義するようになっています。

自動作成した後は、resources ディレクトリ作ってくれないので以下のようなタスク定義して

task initDirs {
   sourceSets*.resources.srcDirs*.each { it.mkdirs() }
}

resources ディレクトリ作成

$ ./gradlew initDirs

をしておくと良いかもしれません。

groovy-application

Groovy アプリケーションの場合は groovy-application タイプを使います。

$ gradle init --type groovy-application

ディレクトリはこんな状態になります。

f:id:Naotsugu:20170801001825p:plain

build.gradle は以下の内容で生成されます。

apply plugin: 'groovy'
apply plugin: 'application'

repositories {
    jcenter()
}

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.4.11'

    testCompile 'org.spockframework:spock-core:1.0-groovy-2.4'
}

mainClassName = 'App'

java-application とほとんど同じです。

テストライブラリはデフォルトで spock になります。

groovy-library

Groovy ライブラリの場合は groovy-library タイプを使います。

$ gradle init --type groovy-library

ディレクトリはこんな状態になります。

f:id:Naotsugu:20170801001843p:plain

build.gradle は以下の内容で生成されます。

apply plugin: 'groovy'

repositories {
    jcenter()
}

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.4.11'
    testCompile 'org.spockframework:spock-core:1.0-groovy-2.4'
}

ちなみに、コンパイル後のクラスファイルは build/classes/main に一緒くたに入れられていましたが、Gradle 4 からは以下のようなレイアウトに変更になっています。

Java, `src/main/java` -> build/classes/java/main
Groovy, `src/main/groovy` -> build/classes/groovy/main
Scala, `src/main/scala` -> build/classes/scala/main

scala-library

Scala ライブラリの場合は scala-library タイプを使います。

$ gradle init --type scala-library

ディレクトリはこんな状態になります。

f:id:Naotsugu:20170801001900p:plain

build.gradle は以下の内容で生成されます。

apply plugin: 'scala'

repositories {
    jcenter()
}

dependencies {
    compile 'org.scala-lang:scala-library:2.11.8'

    testCompile 'junit:junit:4.12'
    testCompile 'org.scalatest:scalatest_2.11:3.0.1'

    testRuntime 'org.scala-lang.modules:scala-xml_2.11:1.0.6'
}

java-application のタイプは今のところ使えません。

pom

pom.xml があるディレクトリで以下のようにするとMaven プロジェクトを変換してくれます。

$ gradle init --type pom