SlideShare uma empresa Scribd logo
1 de 39
Baixar para ler offline
淺談
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,可以變更指定。
• 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
- 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

Mais conteúdo relacionado

Mais procurados

Guide to GraalVM (JJUG CCC 2019 Fall)
Guide to GraalVM (JJUG CCC 2019 Fall)Guide to GraalVM (JJUG CCC 2019 Fall)
Guide to GraalVM (JJUG CCC 2019 Fall)
Koichi Sakata
 
オープンソースのドローン用フライトコントローラ「Dronecode」の概要( #OSC15tk)
オープンソースのドローン用フライトコントローラ「Dronecode」の概要( #OSC15tk)オープンソースのドローン用フライトコントローラ「Dronecode」の概要( #OSC15tk)
オープンソースのドローン用フライトコントローラ「Dronecode」の概要( #OSC15tk)
博宣 今村
 

Mais procurados (20)

Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
 
gRPC入門
gRPC入門gRPC入門
gRPC入門
 
Intro to Git and GitHub
Intro to Git and GitHubIntro to Git and GitHub
Intro to Git and GitHub
 
Jenkinsではじめる継続的インテグレーション
Jenkinsではじめる継続的インテグレーションJenkinsではじめる継続的インテグレーション
Jenkinsではじめる継続的インテグレーション
 
Spring 2.0 技術手冊第一章 - 認識 Spring
Spring 2.0 技術手冊第一章 - 認識 SpringSpring 2.0 技術手冊第一章 - 認識 Spring
Spring 2.0 技術手冊第一章 - 認識 Spring
 
Visual Studio Code 快速上手指南
Visual Studio Code 快速上手指南Visual Studio Code 快速上手指南
Visual Studio Code 快速上手指南
 
ごちうサーチ
ごちうサーチごちうサーチ
ごちうサーチ
 
Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方
 
Guide to GraalVM (JJUG CCC 2019 Fall)
Guide to GraalVM (JJUG CCC 2019 Fall)Guide to GraalVM (JJUG CCC 2019 Fall)
Guide to GraalVM (JJUG CCC 2019 Fall)
 
無線LANデバイスについて(kernelレベル)
無線LANデバイスについて(kernelレベル) 無線LANデバイスについて(kernelレベル)
無線LANデバイスについて(kernelレベル)
 
Jenkins with Docker
Jenkins with DockerJenkins with Docker
Jenkins with Docker
 
寫給大家的 Git 教學
寫給大家的 Git 教學寫給大家的 Git 教學
寫給大家的 Git 教學
 
Multibranch pipelineでいろいろ学んだこと
Multibranch pipelineでいろいろ学んだことMultibranch pipelineでいろいろ学んだこと
Multibranch pipelineでいろいろ学んだこと
 
Docker 基本のおさらい
Docker 基本のおさらいDocker 基本のおさらい
Docker 基本のおさらい
 
Dockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルDockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクル
 
Machine configoperatorのちょっとイイかもしれない話
Machine configoperatorのちょっとイイかもしれない話 Machine configoperatorのちょっとイイかもしれない話
Machine configoperatorのちょっとイイかもしれない話
 
オープンソースのドローン用フライトコントローラ「Dronecode」の概要( #OSC15tk)
オープンソースのドローン用フライトコントローラ「Dronecode」の概要( #OSC15tk)オープンソースのドローン用フライトコントローラ「Dronecode」の概要( #OSC15tk)
オープンソースのドローン用フライトコントローラ「Dronecode」の概要( #OSC15tk)
 
Jenkins使ってみた~Windows編~
Jenkins使ってみた~Windows編~Jenkins使ってみた~Windows編~
Jenkins使ってみた~Windows編~
 
Jenkins 再入門
Jenkins 再入門Jenkins 再入門
Jenkins 再入門
 
Docker應用
Docker應用Docker應用
Docker應用
 

Destaque

Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Justin Lin
 
Java SE 7 技術手冊投影片第 09 章 - Collection與Map
Java SE 7 技術手冊投影片第 09 章 - Collection與MapJava SE 7 技術手冊投影片第 09 章 - Collection與Map
Java SE 7 技術手冊投影片第 09 章 - Collection與Map
Justin Lin
 
Java SE 7 技術手冊投影片第 13 章 - 視窗程式設計
Java SE 7 技術手冊投影片第 13 章 - 視窗程式設計Java SE 7 技術手冊投影片第 13 章 - 視窗程式設計
Java SE 7 技術手冊投影片第 13 章 - 視窗程式設計
Justin Lin
 

Destaque (20)

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

Semelhante a 淺談 Groovy 與 Gradle

Groovy:Candy for Java Developers
Groovy:Candy for Java DevelopersGroovy:Candy for Java Developers
Groovy:Candy for Java Developers
foxgem
 
2012 java two-desktop-appliction-using-j-ruby-with-swt
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
tka
 
Java Build Tool course in 2011
Java Build Tool course in 2011Java Build Tool course in 2011
Java Build Tool course in 2011
Ching Yi Chan
 
D2_Node在淘宝的应用实践
D2_Node在淘宝的应用实践D2_Node在淘宝的应用实践
D2_Node在淘宝的应用实践
Jackson Tian
 
KSDG_007_Web 編程另闢蹊徑-GWT,Dart,TypeScript介紹與比較
KSDG_007_Web 編程另闢蹊徑-GWT,Dart,TypeScript介紹與比較KSDG_007_Web 編程另闢蹊徑-GWT,Dart,TypeScript介紹與比較
KSDG_007_Web 編程另闢蹊徑-GWT,Dart,TypeScript介紹與比較
Stipc Nsysu
 
这年头,你只需要懂Node webkit
这年头,你只需要懂Node webkit这年头,你只需要懂Node webkit
这年头,你只需要懂Node webkit
LainZQ
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践
taobao.com
 

Semelhante a 淺談 Groovy 與 Gradle (20)

Groovy:Candy for Java Developers
Groovy:Candy for Java DevelopersGroovy:Candy for Java Developers
Groovy:Candy for Java Developers
 
Android gradle 从入门到gg 3
Android gradle 从入门到gg 3Android gradle 从入门到gg 3
Android gradle 从入门到gg 3
 
第十一堂 學習編譯與上架
第十一堂 學習編譯與上架第十一堂 學習編譯與上架
第十一堂 學習編譯與上架
 
2012 java two-desktop-appliction-using-j-ruby-with-swt
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
 
JCConf2015: groovy to gradle
 JCConf2015: groovy to gradle JCConf2015: groovy to gradle
JCConf2015: groovy to gradle
 
給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發
 
Java Build Tool course in 2011
Java Build Tool course in 2011Java Build Tool course in 2011
Java Build Tool course in 2011
 
Android gradle 从入门到gg 0
Android gradle 从入门到gg 0Android gradle 从入门到gg 0
Android gradle 从入门到gg 0
 
Grails敏捷项目开发
Grails敏捷项目开发Grails敏捷项目开发
Grails敏捷项目开发
 
基于 FRIDA 的全平台逆向分析
基于 FRIDA 的全平台逆向分析基于 FRIDA 的全平台逆向分析
基于 FRIDA 的全平台逆向分析
 
容器與 Gitlab CI 應用
容器與 Gitlab CI 應用容器與 Gitlab CI 應用
容器與 Gitlab CI 應用
 
如何在有限資源下實現十年的後端服務演進
如何在有限資源下實現十年的後端服務演進如何在有限資源下實現十年的後端服務演進
如何在有限資源下實現十年的後端服務演進
 
Gulp.js 自動化前端任務流程
Gulp.js 自動化前端任務流程Gulp.js 自動化前端任務流程
Gulp.js 自動化前端任務流程
 
D2_Node在淘宝的应用实践
D2_Node在淘宝的应用实践D2_Node在淘宝的应用实践
D2_Node在淘宝的应用实践
 
前端自動化工具
前端自動化工具前端自動化工具
前端自動化工具
 
模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構
模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構
模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構
 
Hadoop Map Reduce 程式設計
Hadoop Map Reduce 程式設計Hadoop Map Reduce 程式設計
Hadoop Map Reduce 程式設計
 
KSDG_007_Web 編程另闢蹊徑-GWT,Dart,TypeScript介紹與比較
KSDG_007_Web 編程另闢蹊徑-GWT,Dart,TypeScript介紹與比較KSDG_007_Web 編程另闢蹊徑-GWT,Dart,TypeScript介紹與比較
KSDG_007_Web 編程另闢蹊徑-GWT,Dart,TypeScript介紹與比較
 
这年头,你只需要懂Node webkit
这年头,你只需要懂Node webkit这年头,你只需要懂Node webkit
这年头,你只需要懂Node webkit
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践
 

Mais de Justin Lin

Mais de Justin Lin (20)

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

淺談 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,可以變更指定。
  • 19.
  • 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
  • 38.
  • 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