簡介: Spring Roo 是針對 Java™ 技術的一個輕量級生產力工具,可快速便捷地開發基於 Spring 的應用程序。使用 Spring Roo 建立的應用程序遵循 Spring 最佳實踐,且基於 JPA、Bean Validation (JSR-303) 和 Dependency Injection (JSR-330) 等標準。Roo 提供一個使用方便、上下文感知、由標籤完成的 shell 構建應用程序。Spring Roo 可擴展且支持附件,進一步加強了其功能。本文介紹 Spring Roo 並提供在 Windows® 和 *nix 系統上編譯 Spring Roo 源代碼的分佈指導。 html
簡介 java
Spring 框架於 2002 年年末發佈,目的在於簡化 J2EE(目前是 JavaEE)開發。在過去 8 年中,Spring 成功完成了該使命,提供了 Java 社區框架或功能,好比 Spring Security、Spring MVC、事務管理、Spring 批處理和 Spring 集成,這都易於理解和使用。Spring 但願讓 Java 開發人員的工做更輕鬆、更富成效。爲此,Spring 建立了一個名爲 Spring Roo 的開發工具。 git
Spring Roo(參見 參考資料)是針對 Java 技術的一個可擴展的、基於文本的開源 RAD 工具。它是用於建立和管理基於 Spring 的應用程序的一個強大資源。這裏是任務說明: web
Roo 的任務是從根本上可持續地改善 Java 開發人員的生產效率,而無損工程完整性和靈活性。
這一要求轉換爲構建於 Java 技術之上的一種工具,可持續地增長項目整個生命週期的生產效率,且不限定開發人員使用某一特定方法。Spring Roo 使用流行、可靠和成熟的庫,好比 Spring 框架、Java 持久化 API、Java Server Pages (JSP)、Spring Security、Spring Web Flow、Log4J 和 Maven。Roo 生成的應用程序使用 Bean Validation (JSR-303) 和 Dependency Injection (JSR-330) 這樣的標準,且遵循最佳實踐 SpringSource 認證的應用程序架構。 spring
使用 Spring Roo,您能夠添加和配置 JPA、Spring MVC、Spring Security 等功能,使用 Log4j 進行日誌記錄,測試 JUnit 和 Selenium、Solr、JMS、電子郵件等框架,僅需在 Roo shell 上輸入命令便可。使用 Roo 添加這些功能節省的時間提升了開發人員的生產效率。Roo 不能編寫業務邏輯,但能夠管理應用程序的基礎結構或配置。 shell
Roo 是一個開發時間工具,這意味着應用程序在運行時獨立於 Roo。因爲 Roo 在運行時不存在,它沒有任何性能或內存開銷。這確保您不依賴於 Spring Roo,您只需幾個按鍵便可隨時從您的項目中刪除 Roo。 數據庫
本文討論如何使用 Roo shell 構建簡單的 web 應用程序,並展現如何在 Windows 或 Ubuntu 機器上編譯 Spring Roo 源代碼。 apache
開始使用 Roo shell 編程
經過加載 Roo shell 並使用命令與之交互,您能夠管理和配置應用程序。Roo Shell 是一個製表完成的、上下文感知的、提供提示的命令 shell。您可使用 hint 命令詢問 Spring Roo 您的下一步邏輯操做。Roo 足夠智能,可經過斷定應用程序上下文建議下一步行動。例如,比方說您使用 entity 命令建立了一個實體。而後輸入 hint 命令。Roo 會告訴您應當使用 field 將字段添加到您的實體。該特性減小了 Roo 的概念權重,使其成爲一個優秀的學習工具。您能夠跟隨 Roo help 和 hint 命令建立徹底的應用程序,無需參考文檔。 windows
先決條件
在開始使用 Roo 以前,確保您安裝了:
安裝 Spring Roo
要安裝獨立的 Spring Roo:
(例如,sudo ln -s ~/spring-roo-1.x.x/bin/roo.sh /usr/bin/roo)
構建應用程序
爲向您展現 Roo 的強大功能,讓咱們建立一個簡單的企業會議應用程序。一個會議應用程序有兩個實體:Speaker 和 Talk。一個 Speaker 能夠提供一次或屢次講話,且 Talk 將僅由一個發言人提供。簡單的類圖如圖 1 所示。
建立應用程序:
C:\Users\xebia\demo\conference>roo ____ ____ ____ / __ \/ __ \/ __ \ / /_/ / / / / / / / / _, _/ /_/ / /_/ / /_/ |_|\____/\____/ 1.1.B.RELEASE [rev 793f2b0] Welcome to Spring Roo. For assistance press TAB or type "hint" then hit ENTER. roo> |
既然咱們在 Roo shell 內部,咱們將使用 Roo 的 hint 命令來引導接下來的步驟。hint 建議使用 project 建立一個新的基於 Maven 的 Spring 項目(參見清單 2)。
Welcome to Spring Roo. For assistance press TAB or type "hint" then hit ENTER. roo> hint Welcome to Roo! We hope you enjoy your stay! Before you can use many features of Roo, you need to start a new project. To do this, type ’project’ (without the quotes) and then hit TAB. Enter a --topLevelPackage like ’com.mycompany.projectname’ (no quotes). When you're finished completing your --topLevelPackage, press ENTER. Your new project will then be created in the current working directory. Note that Roo frequently allows the use of TAB, so press TAB regularly. Once your project is created, type ’hint’ and ENTER for the next suggestion. You're also welcome to visit http://forum.springframework.org`for Roo help. roo> |
正如 hint 命令所建議的,咱們將使用 project 命令建立一個項目。該命令有一個必要屬性 topLevelPackage,用於指定根程序包的名稱。除了必要屬性以外,咱們將使用兩個可選屬性:java(指定 Java 版本)和 projectName(指定項目名稱)。輸入如下內容:
project --topLevelPackage com.dw.roo.conference --java 6 --projectName conference |
該命令將建立一個 Maven V2 管理的基於 Spring 的項目,如如下輸出所示:
Created C:\Users\xebia\demo\conference\pom.xml Created SRC_MAIN_JAVA Created SRC_MAIN_RESOURCES Created SRC_TEST_JAVA Created SRC_TEST_RESOURCES Created SRC_MAIN_WEBAPP Created SRC_MAIN_RESOURCES\META-INF\spring Created SRC_MAIN_RESOURCES\META-INF\spring\applicationContext.xml Created SRC_MAIN_RESOURCES\log4j.properties |
再次輸入 hint 向 Roo 詢問下一步行動。此次它建議創建持久化機制。在 shell 上輸入 persistence setup 並按下 Tab 三次。您會得到 --provider 選項。按下 H 而後按下 Tab 完成 「HIBERNATE」。在提供者以後,按下 tab 選擇數據庫,您會看到有大量選項。由於咱們使用 Hibernate 做爲咱們的提供者,咱們不能選擇非關係型數據庫,好比 Google App Engine。如今,我打算使用 HYPERSONIC_IN_MEMORY 數據庫。
persistence setup --provider HIBERNATE --database HYPERSONIC_IN_MEMORY |
還有其餘可選屬性,好比用戶名和密碼,此次咱們不須要這些。
如今咱們已經創建了持久化機制,咱們將再次使用 hint 命令。此次咱們被告知要使用 entity 命令建立實體。Entity 用於建立實際域對象,且有一個必要屬性 class,用於指定實體的名稱。除了必需的 --class 屬性,咱們還將使用 --testAutomatically 屬性,該屬性爲域對象建立集成測試。讓咱們建立兩個實體:Speaker 和 Talk。
entity --class ~.domain.Speaker –testAutomatically entity --class ~.domain.Talk --testAutomatically |
我使用了 ~ 做爲項目頂級程序包的佔位符。
Entity 將建立一個靈活的、特性豐富的 JPA 實體。所建立的實體將有 JPA @Entity ,帶有 ID、版本、EntityManager 和無參數的構造函數。所生成的實體將擁有 persist、merge、remove、flush、count、find 和 findById 等方法。若是看一下該命令的輸出,您會注意到該命令除了建立 Java 文件(爲 Speaker 和 Talk),還建立了以 *Roo_*.aj 結尾的 AspectJ 文件。這些 *Roo_*.aj 稱爲 Intertype Declaration (ITD)、Mixins 或 Introductions。Roo 將 ITD 做爲一個代碼生成的工件。ITDs 容許 Roo 在一個單獨的編譯單元中生成代碼,但 ITDs 在編譯時被合併成同一個編譯類。AspectJ intertype 聲明用於自動生成 ID 和版本字段,以及域類中持久化字段的 getters 和 setters。
再次使用 hint 提供建議,根據建議使用 field 命令將字段添加到實體。讓咱們給 Speaker 實體添加一些字段:
field string --fieldName firstname --class ~.domain.Speaker --notNull field string --fieldName lastname --notNull field string --fieldName email --unique --notNull field string --fieldName organization field date --fieldName birthdate --type java.util.Date --past --notNull field number --type java.lang.Long --fieldName age --min 25 --max 60 |
--class 選項容許咱們指定向哪一個類添加字段。
field 命令可用於指定特定於 JavaBean 驗證的註釋,含有 --max 和 --min 等選項。它還可用於指定特定於 JPA 的註釋,含有 --fetch、--column 和 --unique 等選項。對於日期字段,您還能夠指定日期應當是過去仍是未來,正如上面使用的。使用 field,您無需記住這些註釋。
如今讓咱們向 Talk 實體添加一些字段:
field string --fieldName title --class ~.domain.Talk --notNull field string --fieldName description --notNull --sizeMax 4000 |
目前爲止,咱們建立了實體並向其添加了字段,可是咱們沒有指定它們之間的關係。Speaker 與 Talk 之間的關係是 ONE_TO_MANY(例如,一個發言人可發表屢次講話)。這經過 field 完成,以下所示:
field set --fieldName talks --element ~.domain.Talk --class \ ~.domain.Speaker --cardinality ONE_TO_MANY field reference --fieldName speaker --type ~.domain.Speaker \ --class ~.domain.Talk –notNull |
如今咱們想爲會議應用程序 scaffold(搭建) 一個 web 層,可經過 controller 命令完成。生成控制器和全部相關 web 工件最方便的方式是使用 controller all。
controller all --package ~.web |
第一次使用控制器命令還會添加額外的依賴項到您的項目中,好比 Spring MVC 和 Tiles。這可能須要一些時間來運行,由於它須要下載全部依賴項(若是它們不存在於您的 Maven 存儲庫中)。該命令還展現 Roo 的功能之一:只有在須要依賴項時才予以添加。
下一步,咱們將使用 logging 命令創建 log4j。
logging setup --level INFO --package ALL_SPRING |
退出 Roo shell 以前應作的最後一件事是,當咱們使用 entity 命令指定了 --testAutomatically 時,運行生成的集成測試。要從 shell 中運行測試,輸入 perform tests。
Roo 將調用委託給 Maven 來運行測試,所以 perform tests 等同於 mvn test 命令。輸入 q 或 quit 退出 shell。
這些命令將建立一個功能齊全的會議應用程序。接下來咱們將運行這個應用程序。
要運行該應用程序,輸入 mvn tomcat:run,這將啓動 jetty 服務器。打開 web 瀏覽器並轉至 http://localhost:8080/conference/。您會看到圖 2 中的屏幕。
您能夠單擊 Create new Speaker 建立一個會議發言人。您還能夠單擊 List all Speakers 來查看、編輯和刪除用戶。以一樣的方式,您能夠建立一個 Talk,可是必須在建立 Speaker 以後。
這是一個簡單的應用程序,可是它展現如何在數分鐘內從頭輕鬆建立一個新的基於 Spring 的 web 應用程序。在本系列的第 2 部分,我將向您展現如何使用不一樣的 Roo 功能和附加組件構建應用程序。
如今咱們已經建立了一個簡單的應用程序,我將向您展現如何在 Windows 和 Ubuntu 上編譯 Spring Roo 源代碼。
從源代碼構建 Spring Roo
Spring Roo V1.1.0 是最新發布版本,目前正在積極開發 V1.1.1 版本。您可能須要從源代碼構建 Spring Roo 的緣由以下:
結果
在本部分結尾,您將可以在 Windows 和 *nix 系統上成功運行最新 Spring Roo 源代碼的 Maven 版本。您將可以使用最新的 Spring Roo 並將 Spring Roo 項目導入 Eclipse 或 STS (SpringSource Tool Suite)。
在 Ubuntu 上編譯 Spring Roo 源代碼的過程
在 Ubuntu(和其餘 *nix 系統)上編譯源代碼很容易。只需遵循如下步驟:
C:\dev\roo-sourcecode\roo>gpg --1ist-secret-keys C:/Users/xebia/AppData/Roaming/gnupg\secring.gpg sec 2048R/2F96093B 2010-07-03 uid shekhar (spring-roo) <shekhargu1ati84@gmai1.com> ssb 2048R/B77E5C63 2010-07-03 C:\dev\roo-sourcecode\roo>_ |
cd wrapping mvn clean install cd.. |
在 Windows 上編譯 Roo 源代碼的過程
與 Ubuntu 相比,在 Windows 上編譯源代碼有點困難。請遵循如下步驟:
{ test "$bindir/" = "$execdir/" || \ { rm -f "$execdir/git.exe" && \ test -z "" && \ ln "$bindir/git.exe" "$execdir/git.exe" 2>/dev/null || \ cp "$bindir/git.exe" "$execdir/git.exe"; } ; } && \ { for p in git-add.exe git-annotate.exe git-apply.exe git-archive.exe git-bisect--helper.exe git-blame.exe git-branch.exe git-bundle.exe git-cat-file.exe git-check-attr.exe git-check-ref rm -f "$execdirf$p" && \ ln "Sexecdir/git.exe" "Sexecdir/$p" 2>/dev/null ll \ ln -s "git.exe" "$execdir/$p" 2>/dev/null || \ cp "Sexecdir/git.exe" "$execdir/$p" Il exit; \ done; } && \ { test x"git-renote-https.exe git-renote-ftp.exe \ git-renote-ftps.exe" = x ll \ { for p in git-remote-https.exe git-remote-ftp.exe \ git-remote-ftps.exe; do \ rm -f "$execdir{$p" && \ ln "Sexecdir/git-remote-http.exe" "$execdir/$p" 2>/dev/null ll \ ln -s 「git-renote—http.exe" "$execdir/$p" 2>/dev/null || \ cp "Sexecdir/git-remote-http.exe" "Sexecdir/$p" ll exit; \ done; } ; } && \ ./check_bindir "z$bindir" "z$execdir" "Sbindir/git—add.exe" ------------------------- Hello, dear Git developer. This is a minimal MSYS environment to work on Git. You are in the git working tree, and all is ready for you to hack. Welcome to msysGit Run 'git help git' to display the help index. Run 'git help <command>' to display help for specific commands. Run '/share/msysGit/add-shortcut.tcl' to add a shortcut to msysGit. It appears that you installed msysGit using the full installer. To set up the Git repositories, please run /share/msysGit/initialize.sh |
C:\>git usage: git [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path] [-pl--paginate|I--no-pager] [--no-replace-objects] [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE] [-c name=value [--help] COMMAND [ARGS] The most commonly used git commands are: add Add file contents to the index bisect Find by binary search the change that introduced a bug branch List, create, or delete branches checkout Checkout a branch or paths to the working tree clone Clone a repository into a new directory commit Record changes to the repository diff Show changes between commits, commit and working tree, etc fetch Download objects and refs from another repository grep Print lines matching a pattern init Create an empty git repository or reinitialize an existing log Show commit logs merge Join two or more development histories together mv Move or rename a file, a directory, or a symlink pull Fetch from and merge with another repository or a local bra push Update remote refs along with associated objects rebase Forward-port local commits to the updated upstream head reset Reset current HEAD to the specified state rm Remove files from the working tree and from the index show Show various types of objects status Show the working tree status tag Create, list, delete or verify a tag object signed with GPG See ’git help COMMAND’ for more information on a specific command. C:\>_ |
C:\dev\roo-sourcecode\roo>gpg --1ist-secret-keys C:/Users/xebia/AppData/Roaming/gnupg\secring.gpg sec 2048R/2F96093B 2010-07-03 uid shekhar (spring-roo) <shekhargu1ati84@gmai1.com> ssb 2048R/B77E5C63 2010-07-03 C:\dev\roo-sourcecode\roo>_ |
cd wrapping mvn clean install cd.. |
您如今可使用最新開發的 Roo 版本了。打開命令提示符,建立一個名爲 mkdir roo_dev_demo 的新文件夾,並觸發 roo-dev 命令。您將看到清單 7 中所示的屏幕。
C:\Users\xebia\demo\conference>roo ____ ____ ____ / __ \/ __ \/ __ \ / /_/ / / / / / / / / _, _/ /_/ / /_/ / /_/ |_|\____/\____/ 1.1.B.RELEASE [rev 793f2b0] Welcome to Spring Roo. For assistance press TAB or type "hint" then hit ENTER. roo> |
您可能但願更新 Spring Roo 源代碼來使用最新版本的 Spring Roo。打開命令提示符並轉至 Spring Roo 的源代碼位置。觸發 git pull 命令,該命令會將全部遠程更改拉入到您的本地克隆中,而後執行一個 mvn clean install 命令來編譯更新的源代碼。
結束語
此時,您已經構建了一個簡單的 web 應用程序,期間甚至無需打開咱們的編輯器或參考任何文檔。應用程序容許您對實體執行 CRUD 操做。我但願您看到 Roo 爲 Java 開發人員帶來了重大生產效率收益。它使用大部分開發人員已經熟知的成熟和穩定的技術。
在第 2 部分,咱們將使應用程序更安全、添加國際化支持、添加消息傳遞支持(SMTP 和 JMS),並定製應用程序。咱們還將探究 Roo 的一個數據庫逆向工程特性,將該應用程序轉化爲一個功能全面的企業應用程序。
參考資料
學習
得到產品和技術
討論
關於做者
Shekhar Gulati 是 Xebia India 的一名 Java 顧問。他用 Java 編程語言開發軟件已經 5 年有餘。他在 http://whyjava.wordpress.com 上寫了我的博客。