RustやNode.jsなど、最近のビルドツールは、ビルド時にリポジトリからダウンロードしてきますが、パッケージを記述する程度の使い方しか関与していません。Gradleというのは、Groovyという言語で記述されてるいことから、何かもっと違うことができそうな期待感をもたせてくれます。
Javaに関しては、いつも面倒に感じる環境構築が簡単なのはとても魅力です。IDEを使わずLinuxなどに比べて貧弱なWindowsのDOS窓とテキストエディタだけでも意外と使えることは、何かすぐに試したい場合、とても便利に感じます。(Javaはたまにしか使わないので特に感じます)
またGroovyという言語が使えるのも魅力です。(Groovyも同じくたまに動かしたいプログラムがあったりするため)
しかしJavaを取り巻く環境は、使い方、名前がよく変わったりするため、いろんな意味で大変です。(他も同じところがありますが情報が古め) そこで現時点でのGradleの挙動について押さえておくためテストしました。
まずは、タスクの基本的な使い方と、単独実行jarの作り方、
https://tech-lab.sios.jp/archives/9500
次に、Groovyでちょっと動かしてみたかったもの、
https://nowokay.hatenablog.com/entries/2009/04/09#1239268405
さらにGroovyでGETリクエストによるファイルのダウンロード
https://gist.github.com/ryo-murai/3179735/
の4つをそれぞれのサイトを参考にさせていただき、試しました。
環境) Windows 10
最新バージョンを使用
https://gradle.org/install/
7.4.2
http://jdk.java.net/
JDK 18
それぞれ解凍して、JAVA_HOME(jdk-18),PATH(jdk-18\binとgradle-7.4.2\bin)の設定
> gradle -v
————————————————————
Gradle 7.4.2
————————————————————Build time: 2022-03-31 15:25:29 UTC
Revision: 540473b8118064efcc264694cbcaa4b677f61041Kotlin: 1.5.31
Groovy: 3.0.9
Ant: Apache Ant(TM) version 1.10.11 compiled on July 10 2021
JVM: 18 (Oracle Corporation 18+36-2087)
OS: Windows 10 10.0 amd64
Groovyのバージョンは低めか・・
mkdir App1
cd App1
初期化: デフォルト設定を選択(Groovy, JUnit4..)
gradle init –type java-application
自動的に創られるHelloWorldサンプルのビルド
app/build.gradle
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
plugins { // Apply the application plugin to add support for building a CLI application in Java. id 'application' } repositories { // Use Maven Central for resolving dependencies. mavenCentral() } dependencies { // Use JUnit Jupiter for testing. testImplementation 'org.junit.jupiter:junit-jupiter:5.8.1' // This dependency is used by the application. implementation 'com.google.guava:guava:30.1.1-jre' } application { // Define the main class for the application. mainClass = 'App1.App' } tasks.named('test') { // Use JUnit Platform for unit tests. useJUnitPlatform() } |
app/src/main/java/App1/App.java
1 2 3 4 5 6 7 8 9 10 11 |
package App1; public class App { public String getGreeting() { return "Hello World!"; } public static void main(String[] args) { System.out.println(new App().getGreeting()); } } |
gradle compileJava
サンプルの実行
gradle run
Jarの作成
gradle jar
Jarでの実行
java -cp app\build\libs\app.jar App1.App
サイトを参考に下記いろいろとテスト(build.gradleに追加)
-q 指定は、実行結果のみ出力
例) gradle -q samp1 (App1ディレクトリで実行)
defalut以外表示させようと、expose関連をたしたがうまくいかず
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
task hello { doFirst { println "Hello First!!" } doLast { println "Hello Last!!" } } task hello2 (dependsOn: 'hello'){ println "Hello Task!" } task samp1 { println "Hello 3" } class GreetingTask extends DefaultTask { private String greeting void greeting(g) { greeting = g } @TaskAction def greet() { println greeting } } task gree(type: GreetingTask) { greeting "Hello greet" } task showConfigurations { println configurations } configurations { exposedApi { canBeResolved = true canBeConsumed = true } exposedRuntime { canBeResolved = true canBeConsumed = true } } task showConfigurations2 { configurations.default.each { println it } } |
単独Jarの実行も同様に、
mkdir App2
cd App2
gradle init –type java-application
app/bundle.gradleの最後に以下を追加
1 2 3 4 5 6 7 |
jar { from configurations.default.collect { it.isDirectory() ? it : zipTree(it) } manifest { attributes('Main-Class': 'App2.App') baseName "App2" } } |
(itは組み込み変数でイテレータ)
Jarの作成
gradle jar
実行
java -jar app\build\libs\App2.jar
これが簡単に作れるのはとてもいいです。(ここまで参考サイトとは微妙に違うので注意)
groovyプログラムの実行テスト
mkdir App3
cd App3
gradle init
applicationでなくbasic(default)を選択
空っぽの ./build.gradleに以下記述
1 2 3 4 5 |
def Z = {f -> {x -> {m -> f(x(x))(m)}}({x -> {m -> f(x(x))(m)}})} task combi{ println Z({f -> {n -> n < 2 ? n : f(n - 1) + f(n - 2)}})(7) } |
実行
> gradle combi
> Configure project :
13
BUILD SUCCESSFUL in 1s
コンビネータを使ったフィボナッチのテストでした。(Groovyはλ関数がとてもみやすい)
次にダウンロード
コンビネータテストのbuild.gradleをまると置き換え
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
import java.io.* import groovyx.net.http.HTTPBuilder import groovyx.net.http.EncoderRegistry import static groovyx.net.http.Method.* import static groovyx.net.http.ContentType.* buildscript { repositories { mavenCentral() // mavenRepo url: "http://repository.codehaus.org" } dependencies { classpath 'org.codehaus.groovy.modules.http-builder:http-builder:0.5.2' } } task download { def http = new HTTPBuilder('http://ajax.aspnetcdn.com/ajax/') http.handler.failure = { resp -> println "Unexpected failure: ${resp.statusLine}" } // proxy settings def (host, port) = [System.properties.'http.proxyHost', System.properties.'http.proxyPort'] if(host) http.setProxy(host, port as int, "http") def target = 'src/main/webapp/js/libs' def contents = [ "jQuery/jquery-1.7.2.min.js": "jquery.js", "jqueryui/1.8.22/jquery-ui.min.js": "jquery-ui.js", "jquery.validate/1.9/jquery.validate.min.js": "jquery.validate.js", ] def dest = mkdir(target) contents.each() { http.request(GET, TEXT) { req -> uri.path= it.key response.success = { resp, reader -> println "$resp.statusLine saving downloaded file[$it.value] ..." new File(dest, it.value).setText(reader.text, "UTF-8") } } } } |
Groovyの学習にもとても良いサンプルです。
buildscriptは、groovyをbuild.gradle内で動かすために必要なものだと解釈しました。
実行
> gradle download
> Configure project :
HTTP/1.1 200 OK saving downloaded file[jquery.js] …
Unexpected failure: HTTP/1.1 404 Not Found
HTTP/1.1 200 OK saving downloaded file[jquery.validate.js] …BUILD SUCCESSFUL in 4s
以上、参考サイトから微妙に変更しないといけないところがありましたが、最新の環境でここまで確認できました。