1
GroovySpring Roo
JavaOne2010報告
2
自己紹介•名前:中野 靖治 / @nobeans•所属:NTTソフトウェア株式会社•ブログ: 豆無日記 http://d.hatena.ne.jp/nobeans•主な興味など•サーバサイドJava、Groovy/Grails、xUnit
3
Groovy
4
Groovy?• http://groovy.codehaus.org/• Rubyによく似た文法を持つ動的型言語• もちろん、クロージャもある• Javaコード ⊂ Groovyコード• 高い互換性(100%ではない)• 動的言語のいいところを持ちつつ、既存のJavaの資産(ラ
イブラリ群)を活用できる• JDKクラスにすら動的にメソッド追加可能• JDKクラスに便利メソッドを追加したGDKがある• 最新stableバージョン:Groovy1.7.5• 1.8系:Groovy1.8-beta2(年内には正式版予定)
5
コード例:BeanGroovyJava
コード例:ラムダ式
6
Groovy~Java7
コード例:ラムダ式
7
GroovyJava8
コレクションのリテラル
8
!"#$%&"#$%'%()*%+*%,-
./0%1/0%'%(2/34)*%2534+*%2634,-
77%89:はクォートを省略できる./0%1/0%'%(/4)*%54+*%64,-
コレクション操作
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%()*%,-
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[
11
JVM/LL系セッション•(参考)JavaOne+Developの資料検索結果•Groovy: 16件•Scala: 13件•JRuby: 11件•JavaScript: 8件•Clojure: 8件•一部に言語名を含んでいるだけの誤ヒットも含む•例年に比べると、盛り上がりに欠けてるらしい?
参加した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
参加した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
14
2010年4月にQConTokyoのため来日したGroovyコミッタのPaul King氏
15
日本語DSL by @uehaj
16
!!"仕込み#$%&'()*&(+,-+..)を"/
""#$%&'()*&(+,-+..)の"/
"""0"'-1."23"'-1.)'+--45&-&6+(&7"8
まず"/"0"9("8
表示する"/"0":;9<(-<"9("8
平方根"/"0"=+(>).?;(49(7"8
!!"実行まず"@AA"の"平方根"を"表示する
!!"/3"@A)A
17
セッション総括•いずれかにあてはまる•既存情報の総括的なセッション•自プロダクトを絡めた 宣伝 応用的なセッション•普段からウォッチしている人にとっては、新しい情報はナシ
•もちろん以下の点では価値がある•情報としてよくまとまっている•Project Leadが自ら語っている
18
今回受信した重要メッセージ•Java7,8で予定されてるクロージャやMapリテラルなどは、すでにGroovyで実現済み•使うと良いよ!•Groovyをただの言語としてみるのは不十分•Groovyを取り巻くエコシステムが重要•例:Grails, Griffon, Gradle, GPars, Gaelyk, Spock, etc.
せっかくなのでGroovyエコシステムの主なプロダクトを
ざっと紹介19
20
Grails?• http://grails.org/• Groovyのキラープロダクトの1つ• フルスタックのWebアプリケーションフレームワーク• Groovy版、Ruby on Rails• コミッタ陣が所属していたG2One社がSpringSource社に買
収され、今やSpringのラインナップの1つ• SpringMVC, SpringFramework, Hibernateなどのデ
ファクトなプロダクトを基盤として採用• 面倒な設定は「規約&DSL」でまろやかにラッピング
• 「全てがプラグイン」• たとえば、認証機能は、Spring Securityプラグインをイ
ンストールすればOK(簡単ではないけど)
便利なプラグインたち
•Spring Security Core Plugin• LDAP authentication support• OpenID authentication support• Quartz Plugin• Searchable Plugin (Lucene)• Mail plugin• Export plugin• Grails AppEngine plugin
21
Griffon•http://griffon.codehaus.org/•Swingベースのクライアントアプリケーションフレームワーク•GroovyのSwingBuilderをフル活用•Grailsのアーキテクチャをそのまま踏襲•Jar, Applet, JWSなどにパッケージング可能•将来的に↓だそうです•JavaFX Wrappers for the GUI Builders
22
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の例
Gradle• http://www.gradle.org/• Mavenのような総合的なプロダクト管理ツール• Ivyによるライブラリの依存関係管理• 各種プラグインによる簡単機能追加• Groovy, Maven, Eclipse, OSGi, etc.• GroovyベースのDSLを採用• 柔軟なマルチプロジェクト構成に対応できる!• ディレクトリ構成はMaven方式を踏襲• 環境を壊さずにMavenと同居可能• 気軽にお試しができる!
24
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....
GPars•http://www.gpars.org/•並行プログラミングライブラリ•Java7のFork/Join FWと似たようなもの•並行処理、非同期処理、分散処理のための直感的で安全な方法を提供•コレクションの並行処理(Map/Reduce)•アクタープログラミングモデル•Clojureのエージェント
26
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 }
Gaelyk•http://gaelyk.appspot.com/•Google App Engine用ツールキット•GroovyのPLであるGuillaume Laforge氏が開発中•GAEのAPIをGroovy風にするための薄いラッパー•GroovyライクなDSLや記法をフル活用
28
Spock•http://code.google.com/p/spock/•BDDフレームワーク•Paramterized Test•Power Assert•AST変換を活用して、わかりやすいアサーションメッセージを表示できる•Groovy1.7で本家に取り込まれている
29
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/	%%%%%%%(M*%)*%+*%,*%D*%`*%E*%a*%_*%V-
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
SpringRoo
32
JavaEE6とか言ってるけど...
33
•昨年末、やっとJavaEE6が出てきたけど、Spring/Hibernate系の組合せでノウハウためてる現場って、すでにたくさんあるよね
•標準仕様とはいえ、今からJavaEE6に乗り換える?
•できること自体はそんなに変わらないよね•でも、今までのSpring/Hibernate系って、決して実装における生産性が高いとはいえなかった•設定とか細かいところで面倒なことが残ってたし
そこで
34
ですよ!
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, ....
Rooシェル• rooコマンドで起動する• デフォルトでは、roo.shかroo.batというファイル
名なので、必要な方をrooにリネームしておく• hintコマンドがすごい• 次に何をすると良いかアドバイスしてくれる• TAB補完がすごい• コマンド、オプション、FQCNなどをガンガン補完し
てくれる• コマンド実行でエラーになったら、実行前までロール
バック• 安心して試せる
36
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;\<
•Passive Generation•一度限りの生成(例:Eclipseによるgetter/setter生成)
•生成物は小規模で、手動編集も容易•Active Generation•元ネタファイルを監視していて、自動的に生成ファイルを更新していく
•一般に、特殊なビルドスクリプト、不自然な型モデルを強いられたり、ロックインされがち...等々
38
Code Generation戦略
• Rooは“エレガントなActive Generation”を採用• 元ネタファイル=Javaソースファイル• Javaコード以外を直接編集しなくて良い• RooのAdd-onがJavaファイルを読ん
で、AspectJコードを自動生成する• 元ネタのJavaファイルは変更しない• コンパイル時にAspectJコンパイラが、元ネタJava
コードとAspectJコードと元に、classファイルを生成する• ランタイムでは普通のclassファイルになっている
39
Code Generation戦略
Spring Tool Suite/STS• EclipseベースのSpringSource専用ディストリビューション• Rooの開発ならSpringSource Tool Suiteを使うのがお勧め• もちろん、Rooならターミナルだけでも大丈夫
• STS以外のIDE使う場合• AspectJプラグインがあるとよい• 裏でRooのシェルを起動したターミナルを開いておくとよい• Rooシェルが自動的にJavaファイルの変更を感知して色々
やってくれる• あとでRooシェルを起動したときに、前回との差分に基づい
て自動的にキャッチアップしてくれるので、起動を忘れても大丈夫
• STSならRooが組み込まれてるので、そういう面倒なことは一切必要なし
40
Web層のサポート•Spring MVC、WebFlow•本家本元SpringのWebフレームワークなのでかなり手厚い対応
•GWT•GWT2.1対応もGoogleのGWTチームと共同で開発中。割と本腰を入れてるよう
•Adobe Flex•Wicket、JSF、Vaadin•コミュニティベースで対応中
41
OSGi•Rooの実行基盤は、OSGi上に構築されている•柔軟に拡張できる!•Rooシェルで“osgi ps”コマンドを実行すると、インストールされているOSGiバンドルの状態が確認できる•“osgi install”コマンドで、任意のOSGiバンドルをインストールすることもできる•詳しくは”help osgi”で
42
Roo依存からの脱却• Spring Rooに依存しないようにするのは簡単• Rooは、実行時には全く必要ないのでご心配なく• Rooの痕跡を消す手順:• (1) AspectJ Development Toolsの“Push-In”リ
ファクタリングで、Javaコード上にインライン展開する• (2) pom.xmlからRoo関係のエントリを全て削除• (3) 全ソースを検索し、@Rooアノテーションを全て削除• 同じ手順で必要なものを追加したら、元通りRooの開発環
境に戻すこともできる• 相当面倒だとは思いますけど
43
リリーススケジュール•年末までに 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
!I"
ご清聴ありがとうございました