淺談 Groovy 與 Gradle

Justin Lin
Justin LinTechnology / Community Evangelist at Free lancer
淺談
Groovy 與 Gradle
林信良
http://openhome.cc
議程
•
•
•
•

從 Java 到 Groovy
使用 Groovy 建立 DSL
自動化工具 Gradle
Gradle 與 IDE
從 Java 到 Groovy
Hello, world!
• 這是 Java …
• 這是 Groovy …

- 預設 public
- 內建 print 函式
• 短一點 …

- 自動產生 Setter
- 自動產生 Getter
• 省一點 …

- Gstring 直譯
- 透過 Setter 設值
- 透過 Getter 取值
- 括號、逗號可省
•

•

還要更少 …

太少了? …
• 多一點 …

- List
- Map
- Range
• 方便一點 …
• 安全一點 …
• 強大一點 …

- 建構式
- 運算子重載
• 更強大一點 …

String.prototype.toUpperEach = function(action) {
for(var i = 0; i < this.length; i++) {
action(this.charAt(i).toUpperCase());
}
};
'abcdef'.toUpperEach(function(ch) {
console.log(ch);
});
• 強大、強大再強大 … XD
function toString() {
return this.name + ', ' + this.age;
}
var p1 = {name : 'Justin', age : 38};
var p2 = {name : 'Monica', age : 35};
p1.toString = toString;
console.log(p1.toString());

p2.toString = toString;
console.log(p2.toString());
使用 Groovy 建立 DSL
Groovy 的 Closure
• Closure?

• Lambda?匿名函式?一級函式?
• Closure 應用
• this - 像 Java 的 this,參考至定義 Closure
的類別之實例。

• owner - 包圍 Closure 之物件,也許是 this 參
考之物件,也許是包圍 Closure 之 Closure。

• delegate - 預設是 owner,可以變更指定。
淺談 Groovy 與 Gradle
• DSL – Domain Specific Language

• 構思 …傳入 Closure、會有 make、to、
from、body、xml 等方法 …
簡單吧?
自動化工具 Gradle
建構工具元老
• 一組 XML 標籤
- 專案(Project)
- 目標(Target)
- 任務(Task)

• Ant 的經驗累積

<?xml version="1.0" encoding="UTF-8"?>
<project name="helloworld" default="build">
<property name="src.dir" value="src" />
<property name="lib.dir" value="libs" />
<property name="resource.dir" value="resources" />
<property name="build.dir" value="build" />
<property name="dist.dir" value="dist" />
<!-- 刪除 build.dir 與 dist.dir -->
<target name="clean">
<delete dir="${build.dir}" />
<delete dir="${dist.dir}" />
</target>
<!-- 建立 build.dir 與 dist.dir 與複製相關設定檔 -->
<target name="prepare" depends="clean">
<mkdir dir="${build.dir}" />
<mkdir dir="${dist.dir}" />
<mkdir dir="${build.dir}/libs" />
<mkdir dir="${build.dir}/all" />
</target>
...

- 自動建構的標準化
- 相依管理的需求(以 Ant Ivy 補足)
專案管理工具
• 一組 XML 標籤
- Convention Over Configuration
- Archetype plugin
- 相依性宣告

• Maven 的經驗累積
- 相依性管理的濫用
- 修改預設行為的難度

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.
0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>tw.com.codedata</groupId>
<artifactId>helloworld</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>helloworld</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
企業自動化工具
• 保持 Ant 的自由度、低於 Maven 學習門檻
-
-
-
-

有著 Lifecycle 的精神
相依性管理機制的便利
DSL 的可讀性與容易撰寫
引用 plugin 獲得需要的編譯功能

• 許多開放原始碼專案與工具採用 Gradle
- Hibernate 從 Maven 改用 Gradle …
- Spring 只提供 Maven 或 Gradle 兩種下載方式
- Android Studio 使用 Gradle 建構專案
第一個 Gradle 專案

apply plugin: 'java'
apply plugin:'application'
mainClassName = "tw.com.codedata.HelloWorld"
repositories {
mavenCentral()
}
dependencies {
compile group: 'commons-logging', name: 'commons-logging', version: '1.1.1'
compile group: 'log4j', name: 'log4j', version: '1.2.16'
}
第一個 Gradle 專案
$ gradle run
:compileJava
:processResources
apply plugin: 'java'
:classes
:run
apply plugin:'application'
INFO [main] (HelloWorld.java:11) - Hello World
mainClassName = "tw.com.codedata.HelloWorld"

BUILD SUCCESSFUL

repositories {
mavenCentral()
}
Total time:

6.027 secs

dependencies {
compile group: 'commons-logging', name: 'commons-logging', version: '1.1.1'
compile group: 'log4j', name: 'log4j', version: '1.2.16'
}
Every configuration file becomes
a programming language…
Hello World
• build.gradle
Closure

task hello {
doLast {
println 'Hello world!'
}
}
Closure

• 它是一個 Groovy …
$ gradle -q hello
Hello world!
task upper << {
String someString = 'mY_nAmE'
println "Original: " + someString
println "Upper case: " + someString.toUpperCase()
}
task count << {
4.times { print "$it " }
}
4.times { counter ->
task "task$counter" << {
println "I'm task number $counter"
}
}
$ gradle -q task1
I'm task number 1
• 我不只是設定檔 … XD
task checksum << {
fileList('../antLoadfileResources').each {File file ->
ant.checksum(file: file, property: "cs_$file.name")
println "$file.name Checksum: ${ant.properties["cs_$file.name"]}"
}
}
task loadfile << {
fileList('../antLoadfileResources').each {File file ->
ant.loadfile(srcFile: file, property: file.name)
println "I'm fond of $file.name"
}
}
File[] fileList(String dir) {
file(dir).listFiles({file -> file.isFile() } as FileFilter).sort()
}
• 不用 Groovy 太多知識,先知道二件事 …
- Groovy DSL 大量運用 Closure 機制
- Gradle 的實作大量使用 Delegation 模式

嗯?好像哪裡怪怪的?
Gradle 與 IDE
Gradle 建立基本專案目錄?
• build.gradle 可視為 Groovy 原始碼檔案
apply plugin: 'java'
task "create-dirs" << {
sourceSets*.java.srcDirs*.each { it.mkdirs() }
sourceSets*.resources.srcDirs*.each { it.mkdirs() }
}

• 使用 gradle-templates
- https://github.com/townsfolk/gradle-templates
- gradle createJavaProject
- gradle createWebappProject

- gradle createScalaProject
- ...
Eclipse
• build.gradle
apply plugin: 'eclipse'
• 安裝 eclipse-integration-gradle
- https://github.com/spring-projects/eclipse-integration-gradle/

….
NetBeans
• Gradle Plugins
- http://plugins.netbeans.org/plugin/44510/gradle-support
淺談 Groovy 與 Gradle
參考資料
• Groovy
- http://groovy.codehaus.org/Documentation

- http://www.oracle.com/technetwork/articles/java/groovy1695411.html
- http://java.dzone.com/articles/groovy-dsl-simple-example

• Gradle
- http://www.gradle.org/documentation
- http://www.codedata.com.tw/tag/gradle/

• Gradle 與 IntelliJ IDEA
- http://blog.lyhdev.com/2013/11/intellij-idea-communityedition-free.html
1 of 39

Recommended

Spring 2.0 技術手冊第五章 - JDBC、交易支援 by
Spring 2.0 技術手冊第五章 - JDBC、交易支援Spring 2.0 技術手冊第五章 - JDBC、交易支援
Spring 2.0 技術手冊第五章 - JDBC、交易支援Justin Lin
5.1K views68 slides
Spring native について by
Spring native についてSpring native について
Spring native についてTakamasa Mitsuji
466 views34 slides
さくっと理解するSpring bootの仕組み by
さくっと理解するSpring bootの仕組みさくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みTakeshi Ogawa
65.2K views38 slides
ウェブセキュリティの常識 by
ウェブセキュリティの常識ウェブセキュリティの常識
ウェブセキュリティの常識Hiroshi Tokumaru
31.4K views39 slides
社内Java8勉強会 ラムダ式とストリームAPI by
社内Java8勉強会 ラムダ式とストリームAPI社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPIAkihiro Ikezoe
54.9K views54 slides
Java EE パフォーマンスTips #glassfish_jp by
Java EE パフォーマンスTips #glassfish_jpJava EE パフォーマンスTips #glassfish_jp
Java EE パフォーマンスTips #glassfish_jpNorito Agetsuma
8.1K views32 slides

More Related Content

What's hot

Modern C# Programming 現代的なC#の書き方、ライブラリの選び方 by
Modern C# Programming 現代的なC#の書き方、ライブラリの選び方Modern C# Programming 現代的なC#の書き方、ライブラリの選び方
Modern C# Programming 現代的なC#の書き方、ライブラリの選び方Yoshifumi Kawai
25.8K views32 slides
Spring bootでweb 基本編 by
Spring bootでweb 基本編Spring bootでweb 基本編
Spring bootでweb 基本編なべ
8.7K views25 slides
Jenkinsはじめました - Yahoo! JAPANのCI+CD - by
Jenkinsはじめました - Yahoo! JAPANのCI+CD -Jenkinsはじめました - Yahoo! JAPANのCI+CD -
Jenkinsはじめました - Yahoo! JAPANのCI+CD -Yahoo!デベロッパーネットワーク
11.6K views29 slides
C11,12 SQL Server 2012 Performance Tuning by Yukio Kumazawa by
C11,12 SQL Server 2012 Performance Tuning by Yukio KumazawaC11,12 SQL Server 2012 Performance Tuning by Yukio Kumazawa
C11,12 SQL Server 2012 Performance Tuning by Yukio KumazawaInsight Technology, Inc.
5.8K views61 slides
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門 by
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門Akira Shimosako
28.6K views37 slides
1 システム開発の基礎 第1章 システム開発の基礎知識(1) by
1 システム開発の基礎 第1章 システム開発の基礎知識(1)1 システム開発の基礎 第1章 システム開発の基礎知識(1)
1 システム開発の基礎 第1章 システム開発の基礎知識(1)Enpel
2.6K views18 slides

What's hot(20)

Modern C# Programming 現代的なC#の書き方、ライブラリの選び方 by Yoshifumi Kawai
Modern C# Programming 現代的なC#の書き方、ライブラリの選び方Modern C# Programming 現代的なC#の書き方、ライブラリの選び方
Modern C# Programming 現代的なC#の書き方、ライブラリの選び方
Yoshifumi Kawai25.8K views
Spring bootでweb 基本編 by なべ
Spring bootでweb 基本編Spring bootでweb 基本編
Spring bootでweb 基本編
なべ 8.7K views
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門 by Akira Shimosako
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門
Akira Shimosako28.6K views
1 システム開発の基礎 第1章 システム開発の基礎知識(1) by Enpel
1 システム開発の基礎 第1章 システム開発の基礎知識(1)1 システム開発の基礎 第1章 システム開発の基礎知識(1)
1 システム開発の基礎 第1章 システム開発の基礎知識(1)
Enpel2.6K views
Jbatch実践入門 #jdt2015 by Norito Agetsuma
Jbatch実践入門 #jdt2015Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015
Norito Agetsuma13.9K views
JSRとJEPとJBSの見方や調べ方について by Aya Ebata
JSRとJEPとJBSの見方や調べ方についてJSRとJEPとJBSの見方や調べ方について
JSRとJEPとJBSの見方や調べ方について
Aya Ebata3.5K views
決済サービスのSpring Bootのバージョンを2系に上げた話 by Ryosuke Uchitate
決済サービスのSpring Bootのバージョンを2系に上げた話決済サービスのSpring Bootのバージョンを2系に上げた話
決済サービスのSpring Bootのバージョンを2系に上げた話
Ryosuke Uchitate1.7K views
飛行機設計の入門 by yuukivel
飛行機設計の入門飛行機設計の入門
飛行機設計の入門
yuukivel8.9K views
微積分& 工程數學 (第二版) by 鍾誠 陳鍾誠
微積分& 工程數學 (第二版)微積分& 工程數學 (第二版)
微積分& 工程數學 (第二版)
鍾誠 陳鍾誠14.6K views
V$SQLとその周辺でER図を描いてみよう! by 歩 柴田
V$SQLとその周辺でER図を描いてみよう!V$SQLとその周辺でER図を描いてみよう!
V$SQLとその周辺でER図を描いてみよう!
歩 柴田5.4K views
今さら聞けないDiとspring by 土岐 孝平
今さら聞けないDiとspring今さら聞けないDiとspring
今さら聞けないDiとspring
土岐 孝平24.8K views
これからSpringを使う開発者が知っておくべきこと by 土岐 孝平
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
土岐 孝平21.5K views
そんなリザルトキャッシュで大丈夫か? #jjug by Toshiaki Maki
そんなリザルトキャッシュで大丈夫か? #jjugそんなリザルトキャッシュで大丈夫か? #jjug
そんなリザルトキャッシュで大丈夫か? #jjug
Toshiaki Maki10.7K views
【HinemosWorld2014】B2-3_Hinemos徹底解剖~ジョブ編~ by Hinemos
【HinemosWorld2014】B2-3_Hinemos徹底解剖~ジョブ編~【HinemosWorld2014】B2-3_Hinemos徹底解剖~ジョブ編~
【HinemosWorld2014】B2-3_Hinemos徹底解剖~ジョブ編~
Hinemos5.8K views

Viewers also liked

Joda-Time & JSR 310 – Problems, Concepts and Approaches by
Joda-Time & JSR 310  –  Problems, Concepts and ApproachesJoda-Time & JSR 310  –  Problems, Concepts and Approaches
Joda-Time & JSR 310 – Problems, Concepts and ApproachesJustin Lin
6.8K views66 slides
Java SE 8 技術手冊第 1 章 - Java平台概論 by
Java SE 8 技術手冊第 1 章 - Java平台概論Java SE 8 技術手冊第 1 章 - Java平台概論
Java SE 8 技術手冊第 1 章 - Java平台概論Justin Lin
11.6K views44 slides
Java SE 8 技術手冊第 12 章 - Lambda by
Java SE 8 技術手冊第 12 章 - LambdaJava SE 8 技術手冊第 12 章 - Lambda
Java SE 8 技術手冊第 12 章 - LambdaJustin Lin
4.4K views100 slides
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註 by
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註Justin Lin
2.2K views80 slides
Java SE 8 技術手冊第 10 章 - 輸入輸出 by
Java SE 8 技術手冊第 10 章 - 輸入輸出Java SE 8 技術手冊第 10 章 - 輸入輸出
Java SE 8 技術手冊第 10 章 - 輸入輸出Justin Lin
2.6K views48 slides
Java SE 7 技術手冊投影片第 09 章 - Collection與Map by
Java SE 7 技術手冊投影片第 09 章 - Collection與MapJava SE 7 技術手冊投影片第 09 章 - Collection與Map
Java SE 7 技術手冊投影片第 09 章 - Collection與MapJustin Lin
2.5K views68 slides

Viewers also liked(20)

Joda-Time & JSR 310 – Problems, Concepts and Approaches by Justin Lin
Joda-Time & JSR 310  –  Problems, Concepts and ApproachesJoda-Time & JSR 310  –  Problems, Concepts and Approaches
Joda-Time & JSR 310 – Problems, Concepts and Approaches
Justin Lin6.8K views
Java SE 8 技術手冊第 1 章 - Java平台概論 by Justin Lin
Java SE 8 技術手冊第 1 章 - Java平台概論Java SE 8 技術手冊第 1 章 - Java平台概論
Java SE 8 技術手冊第 1 章 - Java平台概論
Justin Lin11.6K views
Java SE 8 技術手冊第 12 章 - Lambda by Justin Lin
Java SE 8 技術手冊第 12 章 - LambdaJava SE 8 技術手冊第 12 章 - Lambda
Java SE 8 技術手冊第 12 章 - Lambda
Justin Lin4.4K views
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註 by Justin Lin
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Justin Lin2.2K views
Java SE 8 技術手冊第 10 章 - 輸入輸出 by Justin Lin
Java SE 8 技術手冊第 10 章 - 輸入輸出Java SE 8 技術手冊第 10 章 - 輸入輸出
Java SE 8 技術手冊第 10 章 - 輸入輸出
Justin Lin2.6K views
Java SE 7 技術手冊投影片第 09 章 - Collection與Map by Justin Lin
Java SE 7 技術手冊投影片第 09 章 - Collection與MapJava SE 7 技術手冊投影片第 09 章 - Collection與Map
Java SE 7 技術手冊投影片第 09 章 - Collection與Map
Justin Lin2.5K views
Java SE 8 技術手冊第 4 章 - 認識物件 by Justin Lin
Java SE 8 技術手冊第 4 章 - 認識物件Java SE 8 技術手冊第 4 章 - 認識物件
Java SE 8 技術手冊第 4 章 - 認識物件
Justin Lin4.2K views
Java SE 8 技術手冊第 8 章 - 例外處理 by Justin Lin
Java SE 8 技術手冊第 8 章 - 例外處理Java SE 8 技術手冊第 8 章 - 例外處理
Java SE 8 技術手冊第 8 章 - 例外處理
Justin Lin3.2K views
Java SE 8 技術手冊第 5 章 - 物件封裝 by Justin Lin
Java SE 8 技術手冊第 5 章 - 物件封裝Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝
Justin Lin3.4K views
Java SE 8 技術手冊第 3 章 - 基礎語法 by Justin Lin
Java SE 8 技術手冊第 3 章 - 基礎語法Java SE 8 技術手冊第 3 章 - 基礎語法
Java SE 8 技術手冊第 3 章 - 基礎語法
Justin Lin5.3K views
Java SE 8 技術手冊第 6 章 - 繼承與多型 by Justin Lin
Java SE 8 技術手冊第 6 章 - 繼承與多型Java SE 8 技術手冊第 6 章 - 繼承與多型
Java SE 8 技術手冊第 6 章 - 繼承與多型
Justin Lin3.5K views
Java SE 8 技術手冊第 9 章 - Collection與Map by Justin Lin
Java SE 8 技術手冊第 9 章 - Collection與MapJava SE 8 技術手冊第 9 章 - Collection與Map
Java SE 8 技術手冊第 9 章 - Collection與Map
Justin Lin4.9K views
Java SE 7 技術手冊投影片第 13 章 - 視窗程式設計 by Justin Lin
Java SE 7 技術手冊投影片第 13 章 - 視窗程式設計Java SE 7 技術手冊投影片第 13 章 - 視窗程式設計
Java SE 7 技術手冊投影片第 13 章 - 視窗程式設計
Justin Lin2.4K views
Java 8 與 retrolambda by Justin Lin
Java 8 與 retrolambdaJava 8 與 retrolambda
Java 8 與 retrolambda
Justin Lin5K views
資料結構 by Justin Lin
資料結構資料結構
資料結構
Justin Lin1.8K views
Python 起步走 by Justin Lin
Python 起步走Python 起步走
Python 起步走
Justin Lin7.2K views
3D 之邏輯與美感交會 - OpenSCAD by Justin Lin
3D 之邏輯與美感交會 - OpenSCAD3D 之邏輯與美感交會 - OpenSCAD
3D 之邏輯與美感交會 - OpenSCAD
Justin Lin1.4K views
Java SE 8 技術手冊第 16 章 - 整合資料庫 by Justin Lin
Java SE 8 技術手冊第 16 章 - 整合資料庫Java SE 8 技術手冊第 16 章 - 整合資料庫
Java SE 8 技術手冊第 16 章 - 整合資料庫
Justin Lin2.9K views
Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註 by Justin Lin
Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註
Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註
Justin Lin2.8K views
Java SE 8 技術手冊第 17 章 - 反射與類別載入器 by Justin Lin
Java SE 8 技術手冊第 17 章 - 反射與類別載入器Java SE 8 技術手冊第 17 章 - 反射與類別載入器
Java SE 8 技術手冊第 17 章 - 反射與類別載入器
Justin Lin2.3K views

Similar to 淺談 Groovy 與 Gradle

Groovy:Candy for Java Developers by
Groovy:Candy for Java DevelopersGroovy:Candy for Java Developers
Groovy:Candy for Java Developersfoxgem
656 views30 slides
Android gradle 从入门到gg 3 by
Android gradle 从入门到gg 3Android gradle 从入门到gg 3
Android gradle 从入门到gg 3Jun Liu
812 views20 slides
第十一堂 學習編譯與上架 by
第十一堂 學習編譯與上架第十一堂 學習編譯與上架
第十一堂 學習編譯與上架力中 柯
808 views41 slides
2012 java two-desktop-appliction-using-j-ruby-with-swt by
2012 java two-desktop-appliction-using-j-ruby-with-swt2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swttka
508 views37 slides
JCConf2015: groovy to gradle by
 JCConf2015: groovy to gradle JCConf2015: groovy to gradle
JCConf2015: groovy to gradleChing Yi Chan
1.4K views57 slides
給 iOS 工程師的 Flutter 開發 by
給 iOS 工程師的 Flutter 開發給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發Weizhong Yang
7.9K views50 slides

Similar to 淺談 Groovy 與 Gradle(20)

Groovy:Candy for Java Developers by foxgem
Groovy:Candy for Java DevelopersGroovy:Candy for Java Developers
Groovy:Candy for Java Developers
foxgem656 views
Android gradle 从入门到gg 3 by Jun Liu
Android gradle 从入门到gg 3Android gradle 从入门到gg 3
Android gradle 从入门到gg 3
Jun Liu812 views
第十一堂 學習編譯與上架 by 力中 柯
第十一堂 學習編譯與上架第十一堂 學習編譯與上架
第十一堂 學習編譯與上架
力中 柯808 views
2012 java two-desktop-appliction-using-j-ruby-with-swt by tka
2012 java two-desktop-appliction-using-j-ruby-with-swt2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swt
tka508 views
JCConf2015: groovy to gradle by Ching Yi Chan
 JCConf2015: groovy to gradle JCConf2015: groovy to gradle
JCConf2015: groovy to gradle
Ching Yi Chan1.4K views
給 iOS 工程師的 Flutter 開發 by Weizhong Yang
給 iOS 工程師的 Flutter 開發給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發
Weizhong Yang7.9K views
Java Build Tool course in 2011 by Ching Yi Chan
Java Build Tool course in 2011Java Build Tool course in 2011
Java Build Tool course in 2011
Ching Yi Chan1.2K views
Android gradle 从入门到gg 0 by Jun Liu
Android gradle 从入门到gg 0Android gradle 从入门到gg 0
Android gradle 从入门到gg 0
Jun Liu2.5K views
Grails敏捷项目开发 by Michael Yan
Grails敏捷项目开发Grails敏捷项目开发
Grails敏捷项目开发
Michael Yan1K views
基于 FRIDA 的全平台逆向分析 by CC
基于 FRIDA 的全平台逆向分析基于 FRIDA 的全平台逆向分析
基于 FRIDA 的全平台逆向分析
CC 15.3K views
容器與 Gitlab CI 應用 by Philip Zheng
容器與 Gitlab CI 應用容器與 Gitlab CI 應用
容器與 Gitlab CI 應用
Philip Zheng2.8K views
如何在有限資源下實現十年的後端服務演進 by Mu Chun Wang
如何在有限資源下實現十年的後端服務演進如何在有限資源下實現十年的後端服務演進
如何在有限資源下實現十年的後端服務演進
Mu Chun Wang11 views
Gulp.js 自動化前端任務流程 by 洧杰 廖
Gulp.js 自動化前端任務流程Gulp.js 自動化前端任務流程
Gulp.js 自動化前端任務流程
洧杰 廖10.9K views
D2_Node在淘宝的应用实践 by Jackson Tian
D2_Node在淘宝的应用实践D2_Node在淘宝的应用实践
D2_Node在淘宝的应用实践
Jackson Tian1.8K views
前端自動化工具 by 國昭 張
前端自動化工具前端自動化工具
前端自動化工具
國昭 張664 views
模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構 by Mu Chun Wang
模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構
模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構
Mu Chun Wang2.9K views
Hadoop Map Reduce 程式設計 by Wei-Yu Chen
Hadoop Map Reduce 程式設計Hadoop Map Reduce 程式設計
Hadoop Map Reduce 程式設計
Wei-Yu Chen40.4K views
KSDG_007_Web 編程另闢蹊徑-GWT,Dart,TypeScript介紹與比較 by Stipc Nsysu
KSDG_007_Web 編程另闢蹊徑-GWT,Dart,TypeScript介紹與比較KSDG_007_Web 編程另闢蹊徑-GWT,Dart,TypeScript介紹與比較
KSDG_007_Web 編程另闢蹊徑-GWT,Dart,TypeScript介紹與比較
Stipc Nsysu659 views
这年头,你只需要懂Node webkit by LainZQ
这年头,你只需要懂Node webkit这年头,你只需要懂Node webkit
这年头,你只需要懂Node webkit
LainZQ5.9K views
Node.js在淘宝的应用实践 by taobao.com
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践
taobao.com2.6K views

More from Justin Lin

Ch14 簡介 Spring Boot by
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring BootJustin Lin
872 views22 slides
Ch13 整合 Spring MVC/Security by
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityJustin Lin
280 views58 slides
Ch12 Spring 起步走 by
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走Justin Lin
274 views31 slides
Ch11 簡介 JavaMail by
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMailJustin Lin
157 views8 slides
Ch10 Web 容器安全管理 by
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Justin Lin
153 views30 slides
Ch09 整合資料庫 by
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫Justin Lin
233 views92 slides

More from Justin Lin(20)

Ch14 簡介 Spring Boot by Justin Lin
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring Boot
Justin Lin872 views
Ch13 整合 Spring MVC/Security by Justin Lin
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
Justin Lin280 views
Ch12 Spring 起步走 by Justin Lin
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走
Justin Lin274 views
Ch11 簡介 JavaMail by Justin Lin
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMail
Justin Lin157 views
Ch10 Web 容器安全管理 by Justin Lin
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理
Justin Lin153 views
Ch09 整合資料庫 by Justin Lin
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫
Justin Lin233 views
Ch08 自訂標籤 by Justin Lin
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤
Justin Lin133 views
Ch07 使用 JSTL by Justin Lin
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTL
Justin Lin161 views
Ch06 使用 JSP by Justin Lin
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSP
Justin Lin250 views
Ch05 Servlet 進階 API、過濾器與傾聽器 by Justin Lin
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
Justin Lin204 views
Ch04 會話管理 by Justin Lin
Ch04 會話管理Ch04 會話管理
Ch04 會話管理
Justin Lin238 views
Ch03 請求與回應 by Justin Lin
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應
Justin Lin236 views
Ch02 撰寫與設定 Servlet by Justin Lin
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 Servlet
Justin Lin352 views
CH1. 簡介 Web 應用程式 by Justin Lin
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式
Justin Lin1.2K views
14. 進階主題 by Justin Lin
14. 進階主題14. 進階主題
14. 進階主題
Justin Lin406 views
13.並行、平行與非同步 by Justin Lin
13.並行、平行與非同步13.並行、平行與非同步
13.並行、平行與非同步
Justin Lin237 views
12. 除錯、測試與效能 by Justin Lin
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能
Justin Lin153 views
11. 常用內建模組 by Justin Lin
11. 常用內建模組11. 常用內建模組
11. 常用內建模組
Justin Lin149 views
10. 資料永續與交換 by Justin Lin
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換
Justin Lin156 views
9. 資料結構 by Justin Lin
9. 資料結構9. 資料結構
9. 資料結構
Justin Lin292 views

Recently uploaded

商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班 by
商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班
商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班IttrainingIttraining
40 views37 slides
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式 by
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式Shengyou Fan
150 views54 slides
Hacking Facebook for fun and profit by Pranav Hivarekar by
Hacking Facebook for fun and profit by Pranav HivarekarHacking Facebook for fun and profit by Pranav Hivarekar
Hacking Facebook for fun and profit by Pranav HivarekarPranav Hivarekar
6 views69 slides
居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班 by
居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班
居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班IttrainingIttraining
43 views32 slides
AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班 by
AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班
AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班IttrainingIttraining
43 views25 slides
AI Technology & Development of Civilization by
AI Technology & Development of CivilizationAI Technology & Development of Civilization
AI Technology & Development of Civilizationunclebrown017
41 views74 slides

Recently uploaded(6)

商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班 by IttrainingIttraining
商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班
商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式 by Shengyou Fan
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
Shengyou Fan150 views
Hacking Facebook for fun and profit by Pranav Hivarekar by Pranav Hivarekar
Hacking Facebook for fun and profit by Pranav HivarekarHacking Facebook for fun and profit by Pranav Hivarekar
Hacking Facebook for fun and profit by Pranav Hivarekar
居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班 by IttrainingIttraining
居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班
居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班
AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班 by IttrainingIttraining
AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班
AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班
AI Technology & Development of Civilization by unclebrown017
AI Technology & Development of CivilizationAI Technology & Development of Civilization
AI Technology & Development of Civilization
unclebrown01741 views

淺談 Groovy 與 Gradle

  • 2. 議程 • • • • 從 Java 到 Groovy 使用 Groovy 建立 DSL 自動化工具 Gradle Gradle 與 IDE
  • 3. 從 Java 到 Groovy
  • 5. • 這是 Groovy … - 預設 public - 內建 print 函式
  • 6. • 短一點 … - 自動產生 Setter - 自動產生 Getter
  • 7. • 省一點 … - Gstring 直譯 - 透過 Setter 設值 - 透過 Getter 取值 - 括號、逗號可省
  • 9. • 多一點 … - List - Map - Range
  • 12. • 強大一點 … - 建構式 - 運算子重載
  • 13. • 更強大一點 … String.prototype.toUpperEach = function(action) { for(var i = 0; i < this.length; i++) { action(this.charAt(i).toUpperCase()); } }; 'abcdef'.toUpperEach(function(ch) { console.log(ch); });
  • 14. • 強大、強大再強大 … XD function toString() { return this.name + ', ' + this.age; } var p1 = {name : 'Justin', age : 38}; var p2 = {name : 'Monica', age : 35}; p1.toString = toString; console.log(p1.toString()); p2.toString = toString; console.log(p2.toString());
  • 16. Groovy 的 Closure • Closure? • Lambda?匿名函式?一級函式?
  • 18. • this - 像 Java 的 this,參考至定義 Closure 的類別之實例。 • owner - 包圍 Closure 之物件,也許是 this 參 考之物件,也許是包圍 Closure 之 Closure。 • delegate - 預設是 owner,可以變更指定。
  • 20. • DSL – Domain Specific Language • 構思 …傳入 Closure、會有 make、to、 from、body、xml 等方法 …
  • 23. 建構工具元老 • 一組 XML 標籤 - 專案(Project) - 目標(Target) - 任務(Task) • Ant 的經驗累積 <?xml version="1.0" encoding="UTF-8"?> <project name="helloworld" default="build"> <property name="src.dir" value="src" /> <property name="lib.dir" value="libs" /> <property name="resource.dir" value="resources" /> <property name="build.dir" value="build" /> <property name="dist.dir" value="dist" /> <!-- 刪除 build.dir 與 dist.dir --> <target name="clean"> <delete dir="${build.dir}" /> <delete dir="${dist.dir}" /> </target> <!-- 建立 build.dir 與 dist.dir 與複製相關設定檔 --> <target name="prepare" depends="clean"> <mkdir dir="${build.dir}" /> <mkdir dir="${dist.dir}" /> <mkdir dir="${build.dir}/libs" /> <mkdir dir="${build.dir}/all" /> </target> ... - 自動建構的標準化 - 相依管理的需求(以 Ant Ivy 補足)
  • 24. 專案管理工具 • 一組 XML 標籤 - Convention Over Configuration - Archetype plugin - 相依性宣告 • Maven 的經驗累積 - 相依性管理的濫用 - 修改預設行為的難度 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance" xsi:schemaLocation="http://maven.apache.org/POM/4.0. 0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>tw.com.codedata</groupId> <artifactId>helloworld</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>helloworld</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
  • 25. 企業自動化工具 • 保持 Ant 的自由度、低於 Maven 學習門檻 - - - - 有著 Lifecycle 的精神 相依性管理機制的便利 DSL 的可讀性與容易撰寫 引用 plugin 獲得需要的編譯功能 • 許多開放原始碼專案與工具採用 Gradle - Hibernate 從 Maven 改用 Gradle … - Spring 只提供 Maven 或 Gradle 兩種下載方式 - Android Studio 使用 Gradle 建構專案
  • 26. 第一個 Gradle 專案 apply plugin: 'java' apply plugin:'application' mainClassName = "tw.com.codedata.HelloWorld" repositories { mavenCentral() } dependencies { compile group: 'commons-logging', name: 'commons-logging', version: '1.1.1' compile group: 'log4j', name: 'log4j', version: '1.2.16' }
  • 27. 第一個 Gradle 專案 $ gradle run :compileJava :processResources apply plugin: 'java' :classes :run apply plugin:'application' INFO [main] (HelloWorld.java:11) - Hello World mainClassName = "tw.com.codedata.HelloWorld" BUILD SUCCESSFUL repositories { mavenCentral() } Total time: 6.027 secs dependencies { compile group: 'commons-logging', name: 'commons-logging', version: '1.1.1' compile group: 'log4j', name: 'log4j', version: '1.2.16' }
  • 28. Every configuration file becomes a programming language…
  • 29. Hello World • build.gradle Closure task hello { doLast { println 'Hello world!' } } Closure • 它是一個 Groovy … $ gradle -q hello Hello world!
  • 30. task upper << { String someString = 'mY_nAmE' println "Original: " + someString println "Upper case: " + someString.toUpperCase() } task count << { 4.times { print "$it " } } 4.times { counter -> task "task$counter" << { println "I'm task number $counter" } } $ gradle -q task1 I'm task number 1
  • 31. • 我不只是設定檔 … XD task checksum << { fileList('../antLoadfileResources').each {File file -> ant.checksum(file: file, property: "cs_$file.name") println "$file.name Checksum: ${ant.properties["cs_$file.name"]}" } } task loadfile << { fileList('../antLoadfileResources').each {File file -> ant.loadfile(srcFile: file, property: file.name) println "I'm fond of $file.name" } } File[] fileList(String dir) { file(dir).listFiles({file -> file.isFile() } as FileFilter).sort() }
  • 32. • 不用 Groovy 太多知識,先知道二件事 … - Groovy DSL 大量運用 Closure 機制 - Gradle 的實作大量使用 Delegation 模式 嗯?好像哪裡怪怪的?
  • 34. Gradle 建立基本專案目錄? • build.gradle 可視為 Groovy 原始碼檔案 apply plugin: 'java' task "create-dirs" << { sourceSets*.java.srcDirs*.each { it.mkdirs() } sourceSets*.resources.srcDirs*.each { it.mkdirs() } } • 使用 gradle-templates - https://github.com/townsfolk/gradle-templates - gradle createJavaProject - gradle createWebappProject - gradle createScalaProject - ...
  • 36. • 安裝 eclipse-integration-gradle - https://github.com/spring-projects/eclipse-integration-gradle/ ….
  • 37. NetBeans • Gradle Plugins - http://plugins.netbeans.org/plugin/44510/gradle-support
  • 39. 參考資料 • Groovy - http://groovy.codehaus.org/Documentation - http://www.oracle.com/technetwork/articles/java/groovy1695411.html - http://java.dzone.com/articles/groovy-dsl-simple-example • Gradle - http://www.gradle.org/documentation - http://www.codedata.com.tw/tag/gradle/ • Gradle 與 IntelliJ IDEA - http://blog.lyhdev.com/2013/11/intellij-idea-communityedition-free.html