build.gradleについて調べた時に引っかかったこととか見つからなかったこととか
環境
- Gradle6.4 (2020/5/6リリース)
始めに
とりあえずGradleのドキュメント見てみると良いかもしれない
便利なプラグイン
名前のリンクはドキュメントへ
- javaプラグイン。これがないとJavaのソースがコンパイルできない
- checkstyleプラグイン。スタイルを揃える時にあると便利(説明セクションへ)
- shadowプラグイン。Fat-Jar(Uber-Jar)プラグインの生成に必要(説明セクションへ)
- ErrorProneプラグイン。静的解析ツール。アンチパターンを探してくれるやつ(説明セクションへ)
Wrapperを使う
./gradlewとか./gradlew.batとかのこと。wrapperタスクの実行で初期化したり更新できたりする
これさえあれば開発者の環境にインストールされているgradleのバージョンが違っても大丈夫!
公式ドキュメント: The Gradle Wrapper
エンコーディングを指定する
指定しないとLinuxとWindowsでビルド結果が変わったりする
例えばUTF-8に指定する時はこういう感じ
// compileJavaタスクのエンコーディング
compileJava.options.encoding = 'UTF-8'
// compileTestJavaタスクのエンコーディング
compileTestJava.options.encoding = 'UTF-8'
// javadocタスクのエンコーディング
javadoc.options.encoding = 'UTF-8'
依存関係の宣言
compileとかtestCompileは非推奨のため使わない
implementationとかtestImplementationとか色々あるが、面倒なので公式ドキュメント
The Java Plugin
apiとかは
The Java Library Pluginに書いてある
一応簡単な説明
compileOnlyはコンパイル時に必要な依存関係。FatJarなどには入らない(Mavenでいうprovidedスコープ)
runtimeOnlyは実行時に必要な依存関係。FatJarなどには入るがソースコード内からは参照不可(だと思うが使ったことがないのでわからない)
implementationはコンパイル時にも実行時にも必要な依存関係。FatJarにも入るしソースコード内からも参照可能だが、これを依存関係とするプロジェクトからは参照不可能(Mavenでいうprovidedとして認識される)
参照できるようにするにはJava Library Pluginのapiを使う
また、先頭にtestとついているもの(例えばtestImplementationなど)は、テスト時にしか有効でない
バージョンを範囲指定する
公式ドキュメントはここ: Declaring Versions and Ranges
testImplementation 'org.junit.jupiter:junit-jupiter:5.6.+'
とかすれば5.6.以下はその時の最新バージョンを使うようになる。
この影響でビルドした環境によってビルド結果が変わるかもしれないので、防止したい場合は依存関係を固定する)
依存関係を固定する
公式ドキュメントはここ: Locking dependency versions
ErrorProneを導入する
pluginsに追加する
id 'net.ltgt.errorprone' version '1.1.1'
依存関係に追加する
dependencies {
// ErrorProne
errorprone 'com.google.errorprone:error_prone_core:2.+'
}
Java8の場合はJava9コンパイラを突っ込む
dependencies {
errorproneJavac 'com.google.errorprone:javac:9+181-r4173-1'
}
Java8の環境でもJava9以上でも実行できるようにしたい場合はこうすると良いかも
if (!JavaVersion.current().isJava9Compatible()) {
dependencies {
errorproneJavac 'com.google.errorprone:javac:9+181-r4173-1'
}
}
javacが置き換えられるっぽいので全部のコンパイルタスクに適用される
CheckStyleを導入する
pluginsに追加する
plugins {
id 'checkstyle'
}
config/checkstyle/checkstyle.xmlをいじる。例えばこう
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
"https://checkstyle.org/dtds/configuration_1_3.dtd">
<module name="Checker">
<module name="FileTabCharacter"/>
<module name="TreeWalker">
<module name="Indentation">
<property name="lineWrappingIndentation" value="8"/>
</module>
<!-- Imports -->
<module name="UnusedImports"/>
<module name="RedundantImport"/>
<module name="ImportOrder">
<property name="separated" value="true"/>
<property name="sortStaticImportsAlphabetically" value="true"/>
</module>
<!-- Brackets -->
<module name="LeftCurly"/>
<module name="RightCurly"/>
<module name="NeedBraces"/>
</module>
</module>
buildタスク実行すれば勝手に実行される
JUnitを使って単体テストをする
依存関係に追加して
testImplementation 'org.junit.jupiter:junit-jupiter:5.6.+'
こういう感じで設定するといい感じになる
tasks.test {
testLogging.showStandardStreams = true // System.outとかerrをログに表示する
useJUnitPlatform()
testLogging {
events('passed', 'skipped', 'failed')
}
}
shadowプラグインを使ってFat Jar(Uber Jar)を生成する
プラグインとして追加する
plugins {
id 'com.github.johnrengelman.shadow' version '5.2.0'
}
shadowjarタスクを実行すればbuild/libs下に完成
relocateしたりminimizeしたりjar名変えたりできるけど面倒なので公式ドキュメントを
https://imperceptiblethoughts.com/shadow/introduction/
検索できるJavadocを生成する
javadoc {
if(JavaVersion.current().isJava9Compatible()) {
options.addBooleanOption('html5', true)
}
}
これでjavadocタスクがいい感じになる(Java9以上が必要)