Gradleでは、JavaプラグインでJavaソースをビルド(コンパイル)してjarファイルを生成することが出来る。
|
|
Javaのコンパイルを行う最小限の例。
build.gradleにJavaプラグインの宣言を追加するだけ。
apply plugin: 'java'
> gradle build :compileJava UP-TO-DATE :processResources UP-TO-DATE :classes UP-TO-DATE :jar :assemble :compileTestJava UP-TO-DATE :processTestResources UP-TO-DATE :testClasses UP-TO-DATE :test UP-TO-DATE :check UP-TO-DATE :build BUILD SUCCESSFUL Total time: 3.524 secs
gradleコマンドにbuildタスクを指定して実行する。
すると、Javaソースのコンパイルやjarファイルの生成および単体テストの実行が行われる。
「gradle jar」のようにjarタスクを指定すると、jarファイルの生成までが行われる。
「UP-TO-DATE」と表示されているタスクは、処理する内容が無かったことを意味する。
GradleのJavaプラグインでは、特に指定しない場合は以下のようなディレクトリー構成を想定している。
(Mavenの構成とそっくり)
ビルドを実行すると、プロジェクトディレクトリーの下に以下のようなディレクトリーが作られる。
生成されるjarファイル名は、デフォルトでは「プロジェクトディレクトリー名.jar
」となる。
コンパイル対象バージョン(javacコマンドの-source/-target相当)は以下の様に指定する。
apply plugin: 'java' sourceCompatibility = 1.6 targetCompatibility = 1.6
Javaのソースファイルのエンコーディングは以下の様にして指定する。
apply plugin: 'java' [compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
compileJavaとcompileTestJavaはコンパイルを行うタスクなので、そのオプションのencodingを設定しているのだと思われる。
参考: NTTソフトウェアのJavaプロジェクトクイックスタート
あるいは、以下のように指定することも出来るらしい。
apply plugin: 'java' tasks.withType(Compile){ options.encoding = 'UTF-8' }
参考: 倭マンさんのGradle ビルドファイル 〜エンコーディングも指定するヨ〜
依存ライブラリー(使用するjarファイル)はdependenciesで指定する。
dependenciesブロック内に、どのタスクでそのライブラリーを使うのかを指定する。
主に「compile」「testCompile」「runtime」を指定することになるだろう。
apply plugin: 'java' dependencies { compile ライブラリーの指定 testCompile ライブラリーの指定 runtime ライブラリーの指定 }
複数のライブラリーを指定する場合は、各行をいっぱい作るか、括弧を付けてその中に複数指定する。
dependencies { compile ライブラリー1 compile ライブラリー2 compile ライブラリー3 }
dependencies {
compile(
ライブラリー1,
ライブラリー2,
ライブラリー3, //末尾がカンマで終わっていても大丈夫
)
}
ライブラリー(jarファイル)の指定方法は、外部モジュール(Mavenのアーティファクト)を指定する方法や、ローカルファイルを指定する方法等がある。
Mavenのアーティファクトは、グループ名・アーティファクト名・バージョンの組で指定する。
指定方法には文字列記法とマップ記法の2種類がある。
記法 | 例 | 備考 |
---|---|---|
文字列記法 | 'junit:junit:4.11' |
|
マップ記法 | group: 'junit', name: 'junit', version: '4.11' |
|
[group: 'junit', name: 'junit', version: '4.11'] |
例えば「compile()」の中に複数のライブラリーを書くときはカンマ区切りになるので、 各ライブラリーをマップ記法で書くなら [] を付けないといけない。 |
バージョンは「4.+
」のように動的バージョンを指定することも出来る。この場合、リポジトリー内の最新バージョンが使われる。
repositories {
mavenCentral()
}
dependencies {
testCompile 'junit:junit:4.+'
}
ローカルファイルを個別に指定する場合はfilesを使う。カンマ区切りで複数指定可能。
dependencies { compile files('libs/a.jar', 'libs/b.jar') }
ディレクトリー内にあるファイルを指定するにはfileTreeを使う。
dependencies { compile fileTree(dir: 'libs', include: '*.jar') }
別のプロジェクトを指定する場合はprojectを使う。
dependencies { compile project(':shared') }
デフォルトでは、生成されるjarファイル名はプロジェクト名(プロジェクトのディレクトリー名)と同じになる。
ビルドスクリプト内でversionを指定すると、生成されるjarファイルにバージョンが付く。
また、jar.baseNameやarchivesBaseNameでjarファイル名を指定することも出来る。
指定内容 | 例 | ||
---|---|---|---|
プロジェクト名 | ビルドスクリプト内の指定 | 生成されるjarファイルの名前 | |
指定なし | java-example | なし | java-example.jar |
バージョンのみ | java-example | version = '0.1-SNAPSHOT' |
java-example-0.1-SNAPSHOT.jar |
baseNameのみ | java-example | jar.baseName = 'zzz' |
zzz.jar |
baseNameとバージョン | java-example | jar.baseName = 'zzz' |
zzz-0.1-SNAPSHOT.jar |
archivesBaseNameとバージョン | java-example | archivesBaseName = 'zzz' |
zzz-0.1-SNAPSHOT.jar |
生成されるjarファイル内のマニフェストファイル(MANIFEST.MF)の属性を指定するには、jar.manifest.attributesに値をセットする。
apply plugin: 'java' jar { manifest.attributes 'Main-Class': 'org.example.Main' from configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) } }
apply plugin: 'java' version = '0.1-SNAPSHOT' jar { manifest { attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version } }
「'キー': '値'
」の形式をカンマ区切りで複数指定できる。
生成されるjarファイル内に(MANIFEST.MF以外の)ファイルを入れるには、src/main/resourcesにファイルを置いておく。 [2015-05-17]
例えばjarファイル内に「META-INF/services/com.example.Spi
」というファイルを入れたい場合、以下のような配置でファイルを用意しておくと、jarファイル生成時に自動的に含めてくれる。
META-INF
services
com.example.Spi
参考: stackoverflowのMETA-INF/services in JAR with Gradle
デフォルトのソースセット(src/main/java, src/main/resources, src/test/java等)以外のソースセットを作ることが出来る。[2015-12-28]
例えばサンプルソースを置く為のsrc/example/javaを作りたい場合、以下のようにする。
〜 sourceSets { example { java { srcDir 'src/example/java' } } } 〜
これでEclipseプロジェクトを作ると、src/example/javaもソースディレクトリーとして認識される。
compileJavaタスクを実行した場合は(src/mainが対象なので)src/example/javaは含まれない。
ビルドして作られたjarファイルには、classファイル(とリソースファイル)しか入っていない。[2021-12-19]
ちょっとファイルサイズは大きくなるが、ソース(javaファイル)も含まれている方がデバッグには便利。
jarファイルにソースファイルを含めるには、jarタスクに処理を追加する。
〜 jar { from ('./src/main/java') { include '**/*.java' } } 〜
依存ライブラリー(dependencies)のjarファイルをまとめて出力することが出来る。[2013-11-06]
apply plugin: 'java'
〜
dependencies {
compile 'commons-cli:commons-cli:1.2'
}
// ライブラリーをコピーするタスク
task copyLib(type: Copy){
from configurations.compile
into 'build/lib'
}
この例では、dependencies(configurations)の「compile」で指定したライブラリーのjarファイルを「build/lib」の下にコピーする。
そのライブラリーがさらに別のライブラリーに依存している場合は、それも一緒にコピーされる。
実行する際にライブラリーコピー用のタスクを指定する。
> gradle copyLib :copyLib BUILD SUCCESSFUL Total time: 9.747 secs > dir /b build\lib commons-cli-1.2.jar
参考: dev-xconnectingさんのGradleで外部依存関係に指定したjarファイルをプロジェクト内のディレクトリにコピーする
依存関係のある複数プロジェクトを扱うには、マルチプロジェクトの設定を行う。[2015-12-28]
例えばcoreプロジェクトとそれを参照するsubプロジェクトがある場合、rootディレクトリーを作り、その下にcoreとsubのプロジェクトを置く。
そして、rootに共通のbuild.gradleを置き、差分だけcoreとsubのbuild.gradleに記述する。
また、rootにはsettings.gradleを置き、プロジェクト一覧を記述する。
なお、プロジェクトのディレクトリー名がアーティファクトIDになるので、そのつもりで命名する必要がある。
(rootのbuild.graldeのgroupを「com.example
」とした場合、coreプロジェクトから生成されるpom.xmlは「<groupId>com.example</groupId>
<artifactId>core</artifactId>
」になる)
include "core", "sub"
subprojects { apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'maven' apply plugin: 'maven-publish' defaultTasks 'jar' group = 'com.example' version = '0.1.0' sourceCompatibility = 1.6 targetCompatibility = 1.6 def defaultEncoding = 'UTF-8' [compileJava, compileTestJava]*.options*.encoding = defaultEncoding repositories { mavenCentral() maven { url 'http://hishidama.github.io/mvnrepository' } } dependencies { testCompile 'junit:junit:4.12' } task wrapper(type: Wrapper) { gradleVersion '2.8' jarFile file('.buildtools/gradlew.jar') } eclipse.classpath.file { whenMerged { classpath -> classpath.entries.findAll { entry -> entry.kind == 'output' }*.path = 'classes' } } // publish task sourceJar(type: Jar) { from sourceSets.main.allJava } publishing { publications { mavenJava(MavenPublication) { from components.java artifact sourceJar { classifier "sources" } } } repositories { maven { url "$buildDir/../../mvnrepository" } } } }
共通のbuild.gradleでは、各プロジェクトに共通の設定を、subprojectsブロック内に記述する。
dependencies { compile 'hoge:fuga:0.1' }
dependencies { compile project(':core') compile 'foo:bar:0.1' }
依存するプロジェクトは、「compile project(':依存プロジェクト名')
」で指定する。
このrootディレクトリーの下でgradleコマンドを実行すると、配下のプロジェクト全てに対してタスクが実行される。
$ cd root $ gradle wrapper :wrapper :core:wrapper :sub:wrapper BUILD SUCCESSFUL Total time: 4.003 secs
$ ./gradlew cleanEclipse eclipse :core:cleanEclipseClasspath UP-TO-DATE :core:cleanEclipseJdt UP-TO-DATE :core:cleanEclipseProject UP-TO-DATE :core:cleanEclipse UP-TO-DATE :sub:cleanEclipseClasspath UP-TO-DATE :sub:cleanEclipseJdt UP-TO-DATE :sub:cleanEclipseProject UP-TO-DATE :sub:cleanEclipse UP-TO-DATE :core:eclipseClasspath :core:eclipseJdt :core:eclipseProject :core:eclipse :sub:eclipseClasspath :sub:eclipseJdt :sub:eclipseProject :sub:eclipse BUILD SUCCESSFUL Total time: 7.719 secs
$ ./gradlew jar :core:compileJava UP-TO-DATE :core:processResources UP-TO-DATE :core:classes UP-TO-DATE :core:jar :sub:compileJava UP-TO-DATE :sub:processResources UP-TO-DATE :sub:classes UP-TO-DATE :sub:jar BUILD SUCCESSFUL Total time: 2.916 secs
jar(compileJava)タスクのようにプロジェクトの依存があるタスクでは、依存の順序に従って実行される。
$ ./gradlew publish :core:generatePomFileForMavenJavaPublication :core:compileJava UP-TO-DATE :core:processResources UP-TO-DATE :core:classes UP-TO-DATE :core:jar UP-TO-DATE :core:sourceJar UP-TO-DATE :core:publishMavenJavaPublicationToMavenRepositoryCould not find metadata com.example:core/maven-metadata.xml in remote (file:/tmp/gradle-example/root/mvnrepository) :core:publish :sub:generatePomFileForMavenJavaPublication :sub:compileJava UP-TO-DATE :sub:processResources UP-TO-DATE :sub:classes UP-TO-DATE :sub:jar UP-TO-DATE :sub:sourceJar UP-TO-DATE :sub:publishMavenJavaPublicationToMavenRepositoryCould not find metadata com.example:sub/maven-metadata.xml in remote (file:/tmp/gradle-example/root/mvnrepository/) :sub:publish BUILD SUCCESSFUL Total time: 3.341 secs $ ls mvnrepository/com/example/ core sub
この例では、publishの出力先を「$buildDir/../../mvnrepository
」にしてある。
$buildDirは各プロジェクトのbuildディレクトリー(root/core/buildやroot/sub/build)なので、「$buildDir/../../mvnrepository
」はroot/mvnrepositoryになる。
個別のプロジェクトに対してgradleコマンドを実行したい場合は、各プロジェクトディレクトリーに移動してコマンドを実行するか、タスクにプロジェクト名を指定して実行する。
$ cd root/core $ ./gradlew jar
$ cd root $ ./gradlew core:jar