#author("2018-11-20T12:37:09+00:00","","") * Gradle - ビルドツール [#n3b340ec] #setlinebreak(on) #contents -- 関連 --- [[Gradleでjarの取得だけを行う]] --- [[GradleでJavaの差分ビルド]] --- [[GitリポジトリをMavenリポジトリとして使用する]] -- 参考 --- http://gradle.monochromeroad.com/docs/userguide/tutorial_using_tasks.html --- http://gradle.monochromeroad.com/docs/userguide/application_plugin.html ** Gradle とは [#bddbb17b] #html(<div style="padding-left:20px;">) Gradle はAndroid Atudio のビルドツールとして採用されるなど、次世代のビルドツールとして注目されている。 ビルド用のスクリプトは GroovyのDSL で簡潔に記述することができる一方で、複雑な箇所は Groovyスクリプトで記述する事も可能。 CoC(設定を超える規約)に則っており、規約に従う事によってビルドスクリプト記述量が大幅に削減できるうえに、 デフォルト設定の上書きも可能な為、規約にハマらない場合にも対応可能となっている。 ※フォルダ構成等の規約は 基本的に Maven と同じ。 #html(</div>) ** インストール方法 [#r60e8d9d] #html(<div style="padding-left:20px;">) (1) 公式サイトのDOWNLOADS からGradleをダウンロード http://gradle.org/gradle-download/ (2) ダウンロードしたzipを解凍し、環境変数 GRADLE_HOME に解凍したディレクトリのPATHを設定する (3) GRADLE_HOME/bin にPATHを通す #html(</div>) ** Gradleプロジェクトの作成 [#e667d617] #myterm2(){{ 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 ** Gradleが期待する基本的なディレクトリ構成 [#be751964] #html(<div style="padding-left:20px;">) 規約に従ったディレクトリ構成の場合は、ビルドスクリプトの大幅な記述量削減が可能となる。 ただし Maven と違い、記述を加える事によって規約に合わないディレクトリ構成でもビルドが可能となっている。 以下、Gradleが期待するディレクトリ構成(Mavenと同じ) プロジェクトルート +--- build.gradle(ビルドスクリプト) +--- src +--- main | +--- java | +--- resources(propertiesファイルなど) | +--- config | +--- webapp (webアプリの場合) | +--- WEB-INF | +--- classes | +--- lib | +--- web.xml | +--- test +--- java +--- resources #html(</div>) ** タスク [#q6188be6] #html(<div style="padding-left:20px;">) "gradle" に続けてタスク名を入力する事で、該当のタスクを実行する事ができる #myterm(){{ gradle init --type java-library }} 以下、主なタスクの一覧(他、詳細は後述) |タスク|説明|実行例|h |init|プロジェクトを作成する|gradle init --type java-library&br;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|実行可能なタスクを確認する|| #html(</div>) ** 基本形 [#kf1480e4] #mycode2(){{ 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' } }} ** タスクの作成 [#w2143f55] #html(<div style="padding-left:20px;">) 簡単なタスクを作成し、実行してみる *** 新規タスクの作成 [#k913b4cc] #html(<div style="padding-left:20px;">) 適当なディレクトリを作成し、配下に以下のファイルを作成する。(ファイル名:build.gradle) #mycode(){{ task hello { doLast { println "hello!" } } }} ショートカット記法を使用する場合 #mycode(){{ task hello << { println "hello!" } }} #html(</div>) *** タスクの実行方法 [#nbd68d3e] #html(<div style="padding-left:20px;">) #myterm(){{ ./gradlew hello }} 結果: #myterm(){{ :hello hello! BUILD SUCCESSFUL Total time: 2.415 secs }} #html(</div>) *** タスクに依存関係を追加する [#sef362af] #html(<div style="padding-left:20px;">) #mycode(){{ task myTask1 { doLast { println "This is myTask1" } } task myTask2(dependsOn: myTask1) { doLast { println "This is myTask2" } } }} 実行 #myterm2(){{ ./gradlew myTask2 > Task :myTask1 This is myTask1 > Task :myTask2 This is myTask2 BUILD SUCCESSFUL in 0s }} #html(</div>) *** タスクに後処理を追加する [#sef362af] #html(<div style="padding-left:20px;">) #mycode(){{ task myTask1 { doLast { println "This is myTask1" } } myTask1.doLast { print "After myTask1" } }} 実行 #myterm2(){{ ./gradlew myTask1 > Task :myTask1 This is myTask1 After myTask1 BUILD SUCCESSFUL in 0s }} #html(</div>) // タスクに後処理を追加する END #html(</div>) // タスクの作成 END ** Tips [#mcd80833] #html(<div style="padding-left:10px;">) *** プラグインの追加 [#f3c6dfe7] #html(<div style="padding-left:10px;">) build.gradle #mycode2(){{ apply plugin: 'java' apply plugin: 'application' }} または #mycode2(){{ plugins { id 'java' id 'application' } }} #html(</div>) *** デフォルトタスクの設定 [#zfe6ca2e] #html(<div style="padding-left:10px;">) build.gradle #mycode(){{ defaultTasks 'タスク名1' 'タスク名2' }} #html(</div>) *** コマンドライン引数をメインクラスに渡す [#b8ba8754] #html(<div style="padding-left:10px;">) #mycode2(){{ run { if (project.hasProperty('args')) { args project.args.split('\\s+') } } }} 実行例 #myterm2(){{ ./gradlew run -Pargs="arg1 arg2" }} #html(</div>) *** JVMパラメータを指定する [#b06c3e98] #html(<div style="padding-left:10px;">) build.gradle #mycode2(){{ applicationDefaultJvmArgs = ["-Xms1024m", "-Xmx1024m"] }} ※http://gradle.monochromeroad.com/docs/userguide/application_plugin.html 関連: [[JavaVMのチューニングメモ]] #html(</div>) *** メインクラスを指定する [#ndc23ba5] #html(<div style="padding-left:10px;">) ./gradlew run 時に実行するメインクラスを指定する #mycode2(){{ mainClassName = "org.gradle.sample.Main" }} #html(</div>) *** Javaのバージョンを指定する [#i68dea9b] #html(<div style="padding-left:10px;">) #mycode2(){{ apply plugin: 'java' sourceCompatibility = '1.8' targetCompatibility = '1.8' }} #html(</div>) *** ソースの文字コードを指定する [#j43f65e2] #html(<div style="padding-left:10px;">) #mycode2(){{ compileJava.options.encoding = 'UTF-8' compileTestJava.options.encoding = 'UTF-8' }} #html(</div>) *** コマンドライン引数で指定されたクラスを実行する [#lcaa7132] #html(<div style="padding-left:10px;">) #mycode2(){{ run { // 引数で指定されたクラスを実行する if (project.hasProperty('main')) { main(project.main) } } }} 実行例 #myterm2(){{ ./gradlew run -Pmain="TestApp1" }} ※TestApp1.java の main メソッドが実行される。 #html(</div>) *** test 実行時に標準出力への出力内容を表示する [#lb2527ca] #mycode2(){{ test { testLogging.showStandardStreams = true } }} #html(</div>) // Tips