Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。由于其运行在 JVM 上的特性,Groovy 可以使用其他 Java 语言编写的库。作为跑在JVM中的另一种语言,Groovy语法与 Java 语言的语法很相似。同时,Groovy 抛弃了Java烦琐的文法。同样的语句,使用Groovy能在最大限度上减少你的击键次数——这确实是“懒惰程序员们”的福音。

Groovy是JVM的一个替代语言(替代是指可以用 Groovy 在Java平台上进行 Java 编程),使用方式基本与使用 Java代码的方式相同,该语言特别适合与Spring的动态语言支持一起使用,设计时充分考虑了Java集成,这使 Groovy 与 Java 代码的互操作很容易。(注意:不是指Groovy替代java,而是指Groovy和java很好的结合编程。

Groovy 官网http://www.groovy-lang.org

 

Groovy 特点

1、 构建在强大的Java语言之上并添加了从Python、Ruby、Smalltalk等语言中学到的 诸多特征,例如动态类型转换、闭包和元编程(meta programming)支持。。

2、为Java开发者提供了 现代最流行的编程语言特性,而且学习成本很低(几乎为零)。

3、 支持DSL(Domain Specific Languages领域定义语言)和其它简洁的语法,让代码变得易于阅读和维护。

4、受检查类型异常(Checked Exception)也可以不用捕获。

5、 Groovy拥有处理原生类型,面向对象以及一个Ant DSL,使得创建Shell Scripts变得非常简单。

6、在开发Web,GUI,数据库或控制台程序时通过减少框架性代码大大提高了开发者的效率。

7、支持单元测试和模拟(对象),可以简化测试。

8、无缝集成所有已经存在的 Java对象和类库。

9、直接编译成Java字节码,这样可以在任何使用Java的地方使用Groovy。

10、支持函数式编程,不需要main函数。

11、一些新的运算符。

12、默认导入常用的包。

13、断言不支持jvm的-ea参数进行开关。

14、支持对对象进行布尔求值。

15、类不支持default作用域,且默认作用域为public。

16、groovy中基本类型也是对象,可以直接调用对象的方法。

 

Groovy 语法

Groovy 语法与Java 语言的语法很相似,虽然 Groovy 的语法源于Smalltalk和Ruby这类语言的理念,但是可以将它想像成 Java 语言的一种更加简单、表达能力更强的变体。在这点上Ruby与 Groovy 不同,因为它的语法与 Java 语法差异很大。

许多 Java 开发人员喜欢 Groovy 代码和 Java 代码的相似性。从学习的角度看,如果知道如何编写 Java 代码,那就已经了解 Groovy 了。Groovy 和 Java 语言的主要区别是:完成同样的任务所需的 Groovy 代码比 Java 代码更少

  • Groovy 的松散的 Java 语法,允许省略行末分号和修改符
  • 除非另行指定,Groovy 的所有内容都为 public
  • Groovy 允许定义简单脚本,同时无需定义正规的 class 对象。
  • Groovy 在普通的常用 Java 对象上增加了一些独特的方法和快捷方式,使得它们更容易使用。
  • Groovy 语法还允许省略变量类型。
  • 关于闭包:可以将闭包 想像为一个代码块,可以现在定义,以后再执行。可以使用这些强大的构造做许多漂亮的事,不过最著名的是简化迭代。使用 Groovy 之后,就有可能再也不需要编写 Iterator 实例了。
  • 动态的 Groovy: 从技术上讲,Groovy 可能是您最近听说过的类型最松散的动态语言之一。从这个角度讲,Groovy 与 Java 语言的区别很大,Java 语言是一种固定类型语言。在 Groovy 中,类型是可选的,所以您不必输入 String myStr = "Hello"; 来声明 String 变量。可以直接使用def进行不指定类型定义,类似于js中的var。

  • 与Java互用:用 Groovy 编写的任何内容都可以编译成标准的 Java 类文件并在 Java 代码中重用。类似地,用标准 Java 代码编写的内容也可以在 Groovy 中重用。

 

Groovy 安装

1. 命令安装

a)Mac OS X (推荐

brew install groovy
sudo port install groovy

 

b)Windows (推荐

apache-groovy-binary-2.4.12.zip

安装配置:

apache-groovy-binary-2.4.12.zip
unzip apache-groovy-binary-2.4.12.zip
sudo cp -r groovy-2.4.12 /opt/groovy-2.4.12

vim /etc/profile

Groovy_HOME=/opt/groovy-2.4.12
export PATH=$Groovy_HOME/bin:$PATH

source /etc/proflile

验证安装:

$ groovy -v
Groovy Version: 2.4.12 JVM: 1.8.0_121 Vendor: Oracle Corporation OS: Mac OS X

 

c)其它平台

apache-groovy-src-2.4.12.zip

 

2. Eclipse 插件安装

Help —> Install New Software... —> Add... 

Name     : groovy
Locaiton : http://dist.springsource.org/snapshot/GRECLIPSE/e4.6/

安装参考 Github: groovy-eclipse

groovy-an-zhuang-yu-kai-fa-01

 

Groovy 新建项目

1. 新建Groovy项目HelloGroovy

File —> New... Other...  —> Groovy  —> Groovy Project

groovy-an-zhuang-yu-kai-fa-02

 

2. 新建Groovy Class 类HelloMimvp

groovy-an-zhuang-yu-kai-fa-03

 

3. 查看Groovy 项目结构

groovy-an-zhuang-yu-kai-fa-04

 

4. 打印 hello mimvp.com

vim  HelloMimvp.groovy

package com.mimvp

class HelloMimvp {

	static main(args) {
		println("hello mimvp.com")
	}

}

运行方式有四种:

1)Groovy 脚本运行:  Run As —> Groovy Script    (推荐

运行结果:hello mimvp.com

 

2)Groovy 编译运行:  Run As —> Groovy Console

将会启动一个小窗口 GroovyStarter

groovy-an-zhuang-yu-kai-fa-05

 

方式3) Java 编译运行: Run As —> Java Application

运行结果:hello mimvp.com

 

方式4) 控制台,命令编译运行:groovy HelloMimvp.groovy

运行结果:

$ groovy HelloMimvp.groovy 
hello mimvp.com

 

Groovy 命令行运行

上面介绍了在Eclipse IDE里运行,Groovy同Java一样,也支持命令行运行

$ groovy -e "println('hello mimvp.com')"
hello mimvp.com

 

控制台下,启动脚本:groovysh

$ groovysh
Groovy Shell (2.4.12, JVM: 1.8.0_121)
Type ':help' or ':h' for help.
--------------------------------------
groovy:000> println "hello mimvp.com"
hello mimvp.com
===> null
groovy:000> println("hello mimvp.com")
hello mimvp.com
===> null
groovy:000> for(i=0;i<5;i++){
groovy:001> println("i : " + i);
groovy:002> }
i : 0
i : 1
i : 2
i : 3
i : 4
===> null

 

groovysh 显示帮助

$ groovysh
Groovy Shell (2.4.12, JVM: 1.8.0_121)
Type ':help' or ':h' for help.
-------------------------------------------------
groovy:000> :help

For information about Groovy, visit:
    http://groovy-lang.org 

Available commands:
  :help      (:h ) Display this help message
  ?          (:? ) Alias to: :help
  :exit      (:x ) Exit the shell
  :quit      (:q ) Alias to: :exit
  import     (:i ) Import a class into the namespace
  :display   (:d ) Display the current buffer
  :clear     (:c ) Clear the buffer and reset the prompt counter
  :show      (:S ) Show variables, classes or imports
  :inspect   (:n ) Inspect a variable or the last result with the GUI object browser
  :purge     (:p ) Purge variables, classes, imports or preferences
  :edit      (:e ) Edit the current buffer
  :load      (:l ) Load a file or URL into the buffer
  .          (:. ) Alias to: :load
  :save      (:s ) Save the current buffer to a file
  :record    (:r ) Record the current session to a file
  :history   (:H ) Display, manage and recall edit-line history
  :alias     (:a ) Create an alias
  :set       (:= ) Set (or list) preferences
  :register  (:rc) Register a new command with the shell
  :doc       (:D ) Open a browser window displaying the doc for the argument

For help on a specific command type:
    :help command 

 

groovysh 退出命令行

:exit  或  :quit

Ctrl + d             // 快捷键退出

 

Groovy 开发示例

1. 变量与函数

package com.mimvp

class HelloMimvp {

	static main(args) {
		test_param()
	}

	static test_param() {
		def mimvp = 2066
		println mimvp				// 2066
		println mimvp.class			// class java.lang.Integer

		mimvp = 'mimvp.com'
		println mimvp				// mimvp.com
		println mimvp.class			// class java.lang.String

		mimvp = ["proxy", "domain", "money"]
		println mimvp				// [proxy, domain, money]
		println mimvp.class			// class java.util.ArrayList

		mimvp = [
			"proxy"	 : "proxy.mimvp.com",
			"domain" : "domain.mimvp.com",
			"money"  : "money.mimvp.com",
			"age"	 : 3,
		]
		println mimvp				// [proxy:proxy.mimvp.com, domain:domain.mimvp.com, money:money.mimvp.com, age:3]
		println mimvp.class			// null
	}
}

 

2. 循环与闭包

static test_class() {
	// list array
	def mimvp = ["proxy", "domain", "money"]
	
	// 方法1
	for(Iterator iter = mimvp.iterator(); iter.hasNext();){
		print iter.next() + ", "		// proxy, domain, money, 
	}
	
	// 方法2
	mimvp.each{
		println it
	}
	
	// 方法3
	mimvp.each{ value ->
		println value
	}
	
	// map hash
	mimvp = [
		"proxy"	 : "proxy.mimvp.com",
		"domain" : "domain.mimvp.com",
		"money"  : "money.mimvp.com",
		"age"	 : 3,
	]
	
	mimvp.each{ key, value ->
		println "${key} : ${value}"
   }
   
//	   proxy : proxy.mimvp.com
//	   domain : domain.mimvp.com
//	   money : money.mimvp.com
//	   age : 3
   
   "mimvp".each{
	   println it.toUpperCase();
   }
//	   M
//	   I
//	   M
//	   V
//	   P
}

 

3. 抓取网页

Groovy 访问网站,有两种方式:

方式1) 通过URL访问,不需要引用 HTTPBuilder

方式2) 通过 HTTPBuilder 访问,需要引入 @Grab

 

/**
 * Groovy 支持 http
 *
 * mimvp.com
 * 2015-11-09
 */

 
@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.7.1' )

import groovyx.net.http.*

import static groovyx.net.http.ContentType.*
import static groovyx.net.http.Method.*
import org.apache.http.auth.*


class MimvpSpider {
	static def proxy_http = "http://208.92.93.218:1080"
	
	static def mimvp_url = "http://proxy.mimvp.com/exist.php"
	static def mimvp_url2 = "https://proxy.mimvp.com/exist.php"
	

	static main(args) {
//		spider_http(MimvpSpider.mimvp_url)
//		spider_web(MimvpSpider.mimvp_url)
		spider_proxy(MimvpSpider.mimvp_url, MimvpSpider.proxy_http)		// http
		spider_proxy(MimvpSpider.mimvp_url2, MimvpSpider.proxy_http)	// https
	}


	// 不需要 groovyx.net.http.HTTPBuilder
	static spider_http(mimvp_url) {
		def connection = new URL(mimvp_url).openConnection()
		connection.setRequestMethod('GET')
		connection.doOutput = true

		def writer = new OutputStreamWriter(connection.outputStream)
		writer.flush()
		writer.close()
		connection.connect()

		def respText = connection.content.text
		println respText
	}


	// 需要 groovyx.net.http.HTTPBuilder
	// 首先groovy请求http需要依赖HTTPBuilder模块儿,不知道怎么安装模块儿,辗转了半天,后来发现支持Grab语法,代码如下
	static spider_web(mimvp_url) {
		def http = new HTTPBuilder('http://proxy.mimvp.com')	// http://proxy.mimvp.com/free.php?proxy=out_hp
		http.request(GET, TEXT) {
			uri.path="/free.php"								// 请求路由
			uri.query = ['proxy' : 'out_hp']					// 请求参数

			response.success ={resp, reader->
				println resp.statusLine.statusCode		// 200
				println resp.headers.'Expires'			// Thu, 19 Nov 1981 08:52:00 GMT
				println resp.headers.'Vary'				// Accept-Encoding
				System.out << reader					// 网页正文
			}
			response.failure={resp-> println resp.status }
		}
	}


	// 设置代理
	static spider_proxy(mimvp_url, proxy) {
		def http = new HTTPBuilder(mimvp_url)

//		http.client.getCredentialsProvider().setCredentials(
//		    new AuthScope("myproxy.com", 8080),
//		    new UsernamePasswordCredentials("proxy-username", "proxy-password")
//		)
		
		def proxy_type = proxy.split("://")[0]
		def proxy_ip = proxy.split("://")[1].split(":")[0]
		def proxy_port = proxy.split("://")[1].split(":")[1]
		proxy_port = proxy_port.toInteger()
		
		println proxy_type
		println proxy_ip
		println proxy_port
		
		
//		http.setProxy('myproxy.com', 8080, 'http')
		http.setProxy(proxy_ip, proxy_port, proxy_type)
		http.ignoreSSLIssues()		// 访问https网站,不需验证

		http.request( GET, TEXT ){ req ->
			response.success = { resp, reader ->
				println "Response: ${reader.text}"
			}
		}
	}
}

 

 

Java 和 Groovy区别

1.  Groovy  Hello

vim  Hello.groovy

package com.mimvp

class HelloGroovy {
    static main(args) {
        println("hello mimvp.com")
    }
}

编译执行:

$ groovy Hello.groovy 
hello mimvp.com

 

2.  Java  Hello

vim  Hello.java

package com.mimvp;

public class Hello {
    public static void main(String[] args) {
        System.out.println("hello mimvp.com");
    }
}

编译执行:

$ javac com/mimvp/Hello.java         // javac 将java源文件Hello.java 编译为class字节码文件 Hello.class
$ java com/mimvp/Hello                   // java 运行class字节码文件 Hello.java (注:不带.class后缀
hello mimvp.com

 

 

参考推荐:

Delphi 安装与开发

Perl 安装与开发

Ruby 安装与开发

Python scrapy 安装与开发

Python requests 安装与开发

Python pyspider 安装与开发

Python3 urllib 用法详解

PhantomJS 安装与开发

Node.js 安装与开发