45
1 Groovy Spring Roo JavaOne2010報告

JavaOne2010 Groovy/Spring Roo

Embed Size (px)

DESCRIPTION

Presented in JJUG CCC 2010 Fall at 2010-10-18

Citation preview

Page 1: JavaOne2010 Groovy/Spring Roo

1

GroovySpring Roo

JavaOne2010報告

Page 2: JavaOne2010 Groovy/Spring Roo

2

自己紹介•名前:中野 靖治 / @nobeans•所属:NTTソフトウェア株式会社•ブログ: 豆無日記 http://d.hatena.ne.jp/nobeans•主な興味など•サーバサイドJava、Groovy/Grails、xUnit

Page 3: JavaOne2010 Groovy/Spring Roo

3

Groovy

Page 4: JavaOne2010 Groovy/Spring Roo

4

Groovy?• http://groovy.codehaus.org/• Rubyによく似た文法を持つ動的型言語• もちろん、クロージャもある• Javaコード ⊂ Groovyコード• 高い互換性(100%ではない)• 動的言語のいいところを持ちつつ、既存のJavaの資産(ラ

イブラリ群)を活用できる• JDKクラスにすら動的にメソッド追加可能• JDKクラスに便利メソッドを追加したGDKがある• 最新stableバージョン:Groovy1.7.5• 1.8系:Groovy1.8-beta2(年内には正式版予定)

Page 5: JavaOne2010 Groovy/Spring Roo

5

コード例:BeanGroovyJava

Page 6: JavaOne2010 Groovy/Spring Roo

コード例:ラムダ式

6

Groovy~Java7

Page 7: JavaOne2010 Groovy/Spring Roo

コード例:ラムダ式

7

GroovyJava8

Page 8: JavaOne2010 Groovy/Spring Roo

コレクションのリテラル

8

!"#$%&"#$%'%()*%+*%,-

./0%1/0%'%(2/34)*%2534+*%2634,-

77%89:はクォートを省略できる./0%1/0%'%(/4)*%54+*%64,-

Page 9: JavaOne2010 Groovy/Spring Roo

コレクション操作

9

()*%+*%,-;6<&&96$%=%>?1%@A%>?1%B%+%C77%'A%(+*%D*%E-

77%暗黙変数の"$を使うと、仮引数を省略できる()*%+*%,-;6<&&96$%=%"$%B%+%C77%'A%(+*%D*%E-

()*%+*%,-;9/6F%=%0G">$%"$%C77%'A%)77%'A%+77%'A%,

()*%+*%,-;H">IJ&&=%>?1%K%+%L'%M%C77%'A%()*%,-

Page 10: JavaOne2010 Groovy/Spring Roo

Grape

10

77%自動的にダウンロード&クラスパスに通してくれる(NO:)PQG/5RSG<?0'T&<SDUT*%1<I?&9'T&<SDUT*%O9G#"<>'T);+;VTW"10<G$%<GS;/0/6F9;&<SDU;B

!<SS9G%&<S%'%!<SS9G;S9$!<SS9GR$F"#;6&/##W&<S;#9$!9O9&R!9O9&;J!!W

I9H%&/:<?$%'%>9X%Y"10&9!/:<?$RWI9H%/009>I9G%'%>9X%Z<>#<&9J009>I9GR&/:<?$W&<S;/IIJ009>I9GR/009>I9GW

&<S;I95?S%[\9&&<*%QG/09L[&<S;">H<%%[\9&&<*%QG/09L[&<S;X/G>%%[\9&&<*%QG/09L[&<S;9GG<G%[\9&&<*%QG/09L[&<S;H/$/&%[\9&&<*%QG/09L[

Page 11: JavaOne2010 Groovy/Spring Roo

11

JVM/LL系セッション•(参考)JavaOne+Developの資料検索結果•Groovy: 16件•Scala: 13件•JRuby: 11件•JavaScript: 8件•Clojure: 8件•一部に言語名を含んでいるだけの誤ヒットも含む•例年に比べると、盛り上がりに欠けてるらしい?

Page 12: JavaOne2010 Groovy/Spring Roo

参加したGroovy系セッション• 9/20• Groovy: To Infinity and Beyond• What's New in Grails 1.3?• The Groovy and Grails BOF, with Live Grails Podcast

Recording• 9/21• Code Generation on the Java Virtual Machine: Writing

Code That Writes Code• 9/22• Polyglot Programming in the Java Virtual Machine

(JVM)• 9/23• Writing Domain-Specific Languages (DSLs), Using

Groovy12

Page 13: JavaOne2010 Groovy/Spring Roo

参加したGroovy系セッション• 9/20• Groovy: To Infinity and Beyond• What's New in Grails 1.3?• The Groovy and Grails BOF, with Live Grails Podcast

Recording• 9/21• Code Generation on the Java Virtual Machine: Writing

Code That Writes Code• 9/22• Polyglot Programming in the Java Virtual Machine

(JVM)• 9/23• Writing Domain-Specific Languages (DSLs), Using

Groovy13

Page 14: JavaOne2010 Groovy/Spring Roo

14

2010年4月にQConTokyoのため来日したGroovyコミッタのPaul King氏

Page 15: JavaOne2010 Groovy/Spring Roo

15

日本語DSL by @uehaj

Page 16: JavaOne2010 Groovy/Spring Roo

16

!!"仕込み#$%&'()*&(+,-+..)を"/

""#$%&'()*&(+,-+..)の"/

"""0"'-1."23"'-1.)'+--45&-&6+(&7"8

まず"/"0"9("8

表示する"/"0":;9<(-<"9("8

平方根"/"0"=+(>).?;(49(7"8

!!"実行まず"@AA"の"平方根"を"表示する

!!"/3"@A)A

Page 17: JavaOne2010 Groovy/Spring Roo

17

セッション総括•いずれかにあてはまる•既存情報の総括的なセッション•自プロダクトを絡めた 宣伝 応用的なセッション•普段からウォッチしている人にとっては、新しい情報はナシ

•もちろん以下の点では価値がある•情報としてよくまとまっている•Project Leadが自ら語っている

Page 18: JavaOne2010 Groovy/Spring Roo

18

今回受信した重要メッセージ•Java7,8で予定されてるクロージャやMapリテラルなどは、すでにGroovyで実現済み•使うと良いよ!•Groovyをただの言語としてみるのは不十分•Groovyを取り巻くエコシステムが重要•例:Grails, Griffon, Gradle, GPars, Gaelyk, Spock, etc.

Page 19: JavaOne2010 Groovy/Spring Roo

せっかくなのでGroovyエコシステムの主なプロダクトを

ざっと紹介19

Page 20: JavaOne2010 Groovy/Spring Roo

20

Grails?• http://grails.org/• Groovyのキラープロダクトの1つ• フルスタックのWebアプリケーションフレームワーク• Groovy版、Ruby on Rails• コミッタ陣が所属していたG2One社がSpringSource社に買

収され、今やSpringのラインナップの1つ• SpringMVC, SpringFramework, Hibernateなどのデ

ファクトなプロダクトを基盤として採用• 面倒な設定は「規約&DSL」でまろやかにラッピング

• 「全てがプラグイン」• たとえば、認証機能は、Spring Securityプラグインをイ

ンストールすればOK(簡単ではないけど)

Page 21: JavaOne2010 Groovy/Spring Roo

便利なプラグインたち

•Spring Security Core Plugin• LDAP authentication support• OpenID authentication support• Quartz Plugin• Searchable Plugin (Lucene)• Mail plugin• Export plugin• Grails AppEngine plugin

21

Page 22: JavaOne2010 Groovy/Spring Roo

Griffon•http://griffon.codehaus.org/•Swingベースのクライアントアプリケーションフレームワーク•GroovyのSwingBuilderをフル活用•Grailsのアーキテクチャをそのまま踏襲•Jar, Applet, JWSなどにパッケージング可能•将来的に↓だそうです•JavaFX Wrappers for the GUI Builders

22

Page 23: JavaOne2010 Groovy/Spring Roo

23

import groovy.swing.SwingBuilderimport javax.swing.*

count = 0def frame = new SwingBuilder().frame(title:'Frame', defaultCloseOperation:JFrame.EXIT_ON_CLOSE, pack:true, show:true) { vbox { def textlabel = label("Click the button!") button( text:'Click Me', actionPerformed: { count++ textlabel.text = "Clicked ${count} time(s)." println "Clicked!" } ) }}

SwingBuilderの例

Page 24: JavaOne2010 Groovy/Spring Roo

Gradle• http://www.gradle.org/• Mavenのような総合的なプロダクト管理ツール• Ivyによるライブラリの依存関係管理• 各種プラグインによる簡単機能追加• Groovy, Maven, Eclipse, OSGi, etc.• GroovyベースのDSLを採用• 柔軟なマルチプロジェクト構成に対応できる!• ディレクトリ構成はMaven方式を踏襲• 環境を壊さずにMavenと同居可能• 気軽にお試しができる!

24

Page 25: JavaOne2010 Groovy/Spring Roo

25

$ cat build.gradle file apply plugin:'groovy'

repositories { mavenCentral() } dependencies { groovy 'org.codehaus.groovy:groovy:1.7.4' testCompile 'junit:junit:4.8.1' }

$ gradle clean test....

Page 26: JavaOne2010 Groovy/Spring Roo

GPars•http://www.gpars.org/•並行プログラミングライブラリ•Java7のFork/Join FWと似たようなもの•並行処理、非同期処理、分散処理のための直感的で安全な方法を提供•コレクションの並行処理(Map/Reduce)•アクタープログラミングモデル•Clojureのエージェント

26

Page 27: JavaOne2010 Groovy/Spring Roo

27

// 10スレッドで並行処理 GParsPool.withPool(10) { assert (1..10).findAllParallel { it % 2 == 0 } == [2, 4, 6, 8, 10] }

// Map/Reduce // filter、mapなどの呼び出しごとにコレクションに展開しないため、 // xxxxParallel系のメソッドと比較して性能的に有利 GParsPool.withPool { assert (1..10).parallel.filter{ it % 2 == 0 }.map{ it }.collection == [2, 4, 6, 8, 10] assert (1..10).parallel.filter{ it % 2 == 0 }.map{ it }.sum() == 30 }

Page 28: JavaOne2010 Groovy/Spring Roo

Gaelyk•http://gaelyk.appspot.com/•Google App Engine用ツールキット•GroovyのPLであるGuillaume Laforge氏が開発中•GAEのAPIをGroovy風にするための薄いラッパー•GroovyライクなDSLや記法をフル活用

28

Page 29: JavaOne2010 Groovy/Spring Roo

Spock•http://code.google.com/p/spock/•BDDフレームワーク•Paramterized Test•Power Assert•AST変換を活用して、わかりやすいアサーションメッセージを表示できる•Groovy1.7で本家に取り込まれている

29

Page 30: JavaOne2010 Groovy/Spring Roo

30

// 「0~9に含まれてる偶数の個数は4個だよね?」(誤)def list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]assert list.findAll{ it % 2 == 0 }.size() == 4

(参考)Power Assert

%%%%%%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!

Z/?SF$4%J##9G$"<>%H/"&9I4%

/##9G$%&"#$;H">IJ&&=%"$%K%+%''%M%C;#"]9RW%''%D%%%%%%%^%%%%^%%%%%%%%%%%%%%%%%%%%%%^%%%%%%^%%%%%%%^%%%%(M*%+*%D*%E*%_-%%%%%%%%`%%%%%%H/&#9%%%%%%%(M*%)*%+*%,*%D*%`*%E*%a*%_*%V-

Page 31: JavaOne2010 Groovy/Spring Roo

GroovyServ• http://kobo.github.com/groovyserv/• JVM/LL系の弱点、起動の遅さを劇的に解消する• Groovy処理系をサーバとして常駐させることで

groovyコマンドの起動をみため上、高速化する• 約10~20倍の高速化(もちろん環境に依存)• Groovy(非native版) 2.32 (sec)• Groovy(native版) 0.90 (sec)• GroovyServ 0.10 (sec)• スクリプト実装時の試行錯誤のストレスが激減• 一部制約あり/標準Groovyと完全互換なわけではない

31

Page 32: JavaOne2010 Groovy/Spring Roo

SpringRoo

32

Page 33: JavaOne2010 Groovy/Spring Roo

JavaEE6とか言ってるけど...

33

•昨年末、やっとJavaEE6が出てきたけど、Spring/Hibernate系の組合せでノウハウためてる現場って、すでにたくさんあるよね

•標準仕様とはいえ、今からJavaEE6に乗り換える?

•できること自体はそんなに変わらないよね•でも、今までのSpring/Hibernate系って、決して実装における生産性が高いとはいえなかった•設定とか細かいところで面倒なことが残ってたし

Page 34: JavaOne2010 Groovy/Spring Roo

そこで

34

ですよ!

Page 35: JavaOne2010 Groovy/Spring Roo

Roo?

35

• http://www.springsource.org/roo• Java開発者向けの、使いやすく、拡張しやすい、テキスト

ベースのRADツール• Rooシェルを起動してコマンド実行する• Javaコードをいじると、裏で自動的に色々やってくれる

• Rooが必要なのは開発時だけ• ランタイムでは不要!!

• Javaの標準的なライブラリ/フレームワーク/ツール群に対応• 例: JDBC, JMS, JTA, JSP, JPA, Hibernate,

EclipseLink, GAE, GWT, Jetty, Tomcat, SpringMVC, WebFlow, Maven, Flex, Log4J, Eclipse, JUnit, AspecJ, ....

Page 36: JavaOne2010 Groovy/Spring Roo

Rooシェル• rooコマンドで起動する• デフォルトでは、roo.shかroo.batというファイル

名なので、必要な方をrooにリネームしておく• hintコマンドがすごい• 次に何をすると良いかアドバイスしてくれる• TAB補完がすごい• コマンド、オプション、FQCNなどをガンガン補完し

てくれる• コマンド実行でエラーになったら、実行前までロール

バック• 安心して試せる

36

Page 37: JavaOne2010 Groovy/Spring Roo

37

B"*C59;"'1<(+'(.B"'5"'1<(+'(.B";11""""DDDD""DDDD""DDDD"""""!"DD"E!"DD"E!"DD"E"""!"!D!"!"!"!"!"!"!"!""!"DF"D!"!D!"!"!D!"!""!D!"GDGEDDDD!EDDDD!""""@)@)A)=H"I;&J"&KK&ALMN

O&-'1*&"(1"P:;9<6"Q11)"R1;"+..9.(+<'&":;&.."STU"1;"(V:&"W>9<(W"(>&<">9("XYSXQ);113":;1%&'("22(1:Z&J&-[+'C+6&".+*:-&.+*:-&";113":&;.9.(&<'&".&(\:"22:;1J95&;"]^UXQYTSX"225+(+$+.&"]_[XQP#Y^,D^YD=X=#Q_".+*:-&";113"&<(9(V"22'-+.."`)51*+9<),1<(+'("22(&.(T\(1*+(9'+--V"`)51*+9<),1<(+'(";113"a9&-5".(;9<6"22a9&-5Y+*&"a9;.(Y+*&`)51*+9<),1<(+'(";113"a9&-5".(;9<6"22a9&-5Y+*&"-+.(Y+*&"22<1(Y\--"22.9b&=9<"H`)51*+9<),1<(+'(";113"a9&-5"<\*$&;"22a9&-5Y+*&":>1<&"22(V:&"%+J+)-+<6)Z1<6`)51*+9<),1<(+'(";113":&;a1;*"&'-9:.&

;113"'1<(;1--&;"+--"22:+'C+6&"`)c&$;113":&;a1;*"&'-9:.&;113"&d9(

B"*J<"(1*'+(e;\<

Page 38: JavaOne2010 Groovy/Spring Roo

•Passive Generation•一度限りの生成(例:Eclipseによるgetter/setter生成)

•生成物は小規模で、手動編集も容易•Active Generation•元ネタファイルを監視していて、自動的に生成ファイルを更新していく

•一般に、特殊なビルドスクリプト、不自然な型モデルを強いられたり、ロックインされがち...等々

38

Code Generation戦略

Page 39: JavaOne2010 Groovy/Spring Roo

• Rooは“エレガントなActive Generation”を採用• 元ネタファイル=Javaソースファイル• Javaコード以外を直接編集しなくて良い• RooのAdd-onがJavaファイルを読ん

で、AspectJコードを自動生成する• 元ネタのJavaファイルは変更しない• コンパイル時にAspectJコンパイラが、元ネタJava

コードとAspectJコードと元に、classファイルを生成する• ランタイムでは普通のclassファイルになっている

39

Code Generation戦略

Page 40: JavaOne2010 Groovy/Spring Roo

Spring Tool Suite/STS• EclipseベースのSpringSource専用ディストリビューション• Rooの開発ならSpringSource Tool Suiteを使うのがお勧め• もちろん、Rooならターミナルだけでも大丈夫

• STS以外のIDE使う場合• AspectJプラグインがあるとよい• 裏でRooのシェルを起動したターミナルを開いておくとよい• Rooシェルが自動的にJavaファイルの変更を感知して色々

やってくれる• あとでRooシェルを起動したときに、前回との差分に基づい

て自動的にキャッチアップしてくれるので、起動を忘れても大丈夫

• STSならRooが組み込まれてるので、そういう面倒なことは一切必要なし

40

Page 41: JavaOne2010 Groovy/Spring Roo

Web層のサポート•Spring MVC、WebFlow•本家本元SpringのWebフレームワークなのでかなり手厚い対応

•GWT•GWT2.1対応もGoogleのGWTチームと共同で開発中。割と本腰を入れてるよう

•Adobe Flex•Wicket、JSF、Vaadin•コミュニティベースで対応中

41

Page 42: JavaOne2010 Groovy/Spring Roo

OSGi•Rooの実行基盤は、OSGi上に構築されている•柔軟に拡張できる!•Rooシェルで“osgi ps”コマンドを実行すると、インストールされているOSGiバンドルの状態が確認できる•“osgi install”コマンドで、任意のOSGiバンドルをインストールすることもできる•詳しくは”help osgi”で

42

Page 43: JavaOne2010 Groovy/Spring Roo

Roo依存からの脱却• Spring Rooに依存しないようにするのは簡単• Rooは、実行時には全く必要ないのでご心配なく• Rooの痕跡を消す手順:• (1) AspectJ Development Toolsの“Push-In”リ

ファクタリングで、Javaコード上にインライン展開する• (2) pom.xmlからRoo関係のエントリを全て削除• (3) 全ソースを検索し、@Rooアノテーションを全て削除• 同じ手順で必要なものを追加したら、元通りRooの開発環

境に戻すこともできる• 相当面倒だとは思いますけど

43

Page 44: JavaOne2010 Groovy/Spring Roo

リリーススケジュール•年末までに Roo 1.1.0 リリース予定•Spring 3.0.x GA対応版•9月頃•Roo 1.1.0.M4•10月頃•Roo 1.1.0.RC1 ←イマココ•10~11月頃•Roo 1.1.0.RELEASE GA

44

Page 45: JavaOne2010 Groovy/Spring Roo

!I"

ご清聴ありがとうございました