JBoss Forge 2入門(mén)教程
《Continuous Enterprise Development in Java》引入了對(duì)Forge的使用,但是都是針對(duì)Forge 1版本編寫(xiě)的?,F(xiàn)在最新版的JBoss Developer Studio 9 beta自帶的都是2.15版本。使用JBoss Developer Studio內(nèi)嵌的Forge遇到很多問(wèn)題,干脆直接下載了Forge 2.19使用命令行進(jìn)行試用?,F(xiàn)在對(duì)Forge 2的介紹實(shí)在太少,結(jié)合這本書(shū)和官方文檔整理了一下入門(mén)教程。
一、介紹
如果你花費(fèi)了時(shí)間開(kāi)發(fā)Jave EE基礎(chǔ)的項(xiàng)目 (或者任何大型點(diǎn)的項(xiàng)目), 你很可能花大量精力創(chuàng)建項(xiàng)目布局,定義依賴,告知在編譯和執(zhí)行過(guò)程中用到的相關(guān)類路徑。雖然使用Maven相比手動(dòng)創(chuàng)建項(xiàng)目會(huì)減少很多負(fù)擔(dān),但一般來(lái)說(shuō)在pom.xml中還是有很多模板來(lái)定義需求。
二、下載安裝Forge
在官網(wǎng)下載壓縮包,解壓配置環(huán)境變量。具體過(guò)程略。
三、創(chuàng)建一個(gè)Maven為基礎(chǔ)的Java EE項(xiàng)目
命令行運(yùn)行forge,切換到工作空間目錄下。創(chuàng)建叫feedback的簡(jiǎn)單應(yīng)用,它允許用戶添加評(píng)論。
先看看怎么安裝Arquillian插件:
一、介紹
如果你花費(fèi)了時(shí)間開(kāi)發(fā)Jave EE基礎(chǔ)的項(xiàng)目 (或者任何大型點(diǎn)的項(xiàng)目), 你很可能花大量精力創(chuàng)建項(xiàng)目布局,定義依賴,告知在編譯和執(zhí)行過(guò)程中用到的相關(guān)類路徑。雖然使用Maven相比手動(dòng)創(chuàng)建項(xiàng)目會(huì)減少很多負(fù)擔(dān),但一般來(lái)說(shuō)在pom.xml中還是有很多模板來(lái)定義需求。
JBoss Forge 為Java EE項(xiàng)目提供增量項(xiàng)目加強(qiáng)。? 以命令shell和集成到一些IDE中的實(shí)現(xiàn), Forge使我們能改變項(xiàng)目文件和文件夾。一些可以使用Forge處理的具體任務(wù)有:
• 增加JPA實(shí)體,描述他們的model
• 配置Maven依賴
• 項(xiàng)目支架搭建
• 從域模型里面逆向工程產(chǎn)生視圖層布局
• 部署到應(yīng)用服務(wù)器
從頭開(kāi)始建項(xiàng)目的話使用Forge來(lái)創(chuàng)建項(xiàng)目布局比較有意義。最終會(huì)給我們一個(gè)從數(shù)據(jù)庫(kù)到視圖層的功能性骨架,我們能用來(lái)作為學(xué)習(xí)工具或?qū)懻鎸?shí)代碼的快捷方式。Forge的用戶界面是一個(gè)shell,因此可以手工安裝并從終端使用(像其他命令行應(yīng)用一樣)。寫(xiě)命令行過(guò)程中,支持Tab鍵提示
【Forge和spring roo類似,不過(guò)沒(méi)有依賴于spring相關(guān),完全符合JEE的標(biāo)準(zhǔn)】
在官網(wǎng)下載壓縮包,解壓配置環(huán)境變量。具體過(guò)程略。
三、創(chuàng)建一個(gè)Maven為基礎(chǔ)的Java EE項(xiàng)目
命令行運(yùn)行forge,切換到工作空間目錄下。創(chuàng)建叫feedback的簡(jiǎn)單應(yīng)用,它允許用戶添加評(píng)論。
[jbdevstudio-workspace]$ project-new --named feedback --topLevelPackage org.cedj.feedback --targetLocation feedback;
現(xiàn)在可看到生成了一個(gè)標(biāo)準(zhǔn)的maven項(xiàng)目。
四、建立JPA和創(chuàng)建實(shí)體
七、現(xiàn)在創(chuàng)建UI層來(lái)看我們的web應(yīng)用
【--targetLocation /directory/path //在該文件夾下創(chuàng)建項(xiàng)目
--topLevelPackage //groupId
--finalName //build中的finalName
--type //默認(rèn)是war, 可選"jar" "parent" "addon" "ear" "resource-jar" "from-archetype"
】
【使用man 命令可看到一些命令的說(shuō)明】
四、建立JPA和創(chuàng)建實(shí)體
[feedback]$ jpa-new-entity --named FeedbackEntry
這個(gè)命令有幾個(gè)作用,首先它在正確的地方創(chuàng)建persistence.xml(在META-INF文件夾下),默認(rèn)是Hibernate配置。 然后在子包model下創(chuàng)建實(shí)體。注意這個(gè)實(shí)體已經(jīng)有一個(gè)id和version以及他們的getters/setters. Forge的好處就是一個(gè)命令就全部創(chuàng)建好可以用了。
如果你不愿意用Java EE容器的默認(rèn)數(shù)據(jù)源,你可以指定額外的連接選項(xiàng)比如JNDI data-source names, JDBC connection information, and data-source types. 注意, 這樣的話你可能配置你的應(yīng)用服務(wù)器來(lái)提供這個(gè)新的data-source and/or database connection.
[feedback]$ jpa-setup --provider Eclipse Link --dbType POSTGRES --dataSourceName java:comp/DefaultDataSource
如果執(zhí)行了jpa-setup命令,你會(huì)發(fā)現(xiàn)提示符變化了:從[feedback] 變到了[persistence.xml]. 在Forge中,提示符總是告訴你在什么地方。 你能輸入命令pwd或者ls。 現(xiàn)在我們回到feedback實(shí)體: 輸入cd ~~ 回到根目錄,再輸入cd src/main/java/org/cedj/model/FeedbackEntry.java.
五、在實(shí)體上創(chuàng)建新的域
五、在實(shí)體上創(chuàng)建新的域
FeedbackEntry實(shí)體應(yīng)該可以用Twitter ID記錄一些用戶的反饋。我們加字段(以及驗(yàn)證他們不為null):
[FeedbackEntry.java]$ jpa-new-field --named twitterHandle --type String
[FeedbackEntry.java]$ jpa-new-field --named feedback --type String
Forge有許多選項(xiàng)快速創(chuàng)建屬性和定制它們的JPA映射。比如我們想指定反饋由什么語(yǔ)言寫(xiě)成。我們能使用Forge快速創(chuàng)建一個(gè)Java枚舉類型,再把它用到實(shí)體中 :
FeedbackEntry$ java-new-enum --named Language --targetPackage org.cedj.feedback.model
[Language.java]$ java-new-enum-const ENGLISH
[Language.java]$ java-new-enum-const FRENCH
注意提示符,F(xiàn)orge有很多命令行在目錄、類或文件之間瀏覽?;氐紽eedbackEntry實(shí)體的命令:
[Language.java]$ cd ..
[model]$ cd FeedbackEntry.java
[FeedbackEntry]$
創(chuàng)建枚舉域:
[FeedbackEntry]$ jpa-new-field --named language --type org.cedj.feedback.model.Language
默認(rèn)JPA域是字符串類型。使用--type選項(xiàng),我們可選基本數(shù)據(jù)類型(int, byte, char), enum,或其他實(shí)體和實(shí)體關(guān)聯(lián) (One-to-One, One-to-Many, Many-to-One, Many-to-Many). 我們?cè)賱?chuàng)建一個(gè)新的Author實(shí)體,增加一個(gè)Many-to-One 關(guān)系到feedback:
$ jpa-new-entity --named Author
[Author.java]$ jpa-new-field --named firstName
[Author.java]$ cd ../FeedbackEntry.java
[FeedbackEntry]$ jpa-new-field --named author --type org.cedj.feedback.model.Author --relationshipType Many-to-One
六、在實(shí)體上增加Bean驗(yàn)證限制
六、在實(shí)體上增加Bean驗(yàn)證限制
Java EE6引入了Bean Validation規(guī)范,這個(gè)規(guī)范允許一個(gè)聲明來(lái)驗(yàn)證限制全部數(shù)據(jù)庫(kù)、應(yīng)用和視圖層。
[FeedbackEntry.java]$ constraint-add --onProperty twitterHandle --constraint NotNull
[FeedbackEntry.java]$ constraint-add --onProperty feedback --constraint NotNull
Forge在后臺(tái)創(chuàng)建validation.xml文件,增加Bean驗(yàn)證依賴和需要的限制。
JSF是默認(rèn)的Java EE用戶界面框架,因此JBoss Forge對(duì)它有許多支持。事實(shí)上只需一個(gè)命令, Forge能輕易從JPA實(shí)體搭建整個(gè)CRUD web應(yīng)用。JSF生成的應(yīng)用遵循幾個(gè)模式和最佳實(shí)踐: usage of CDI conversation scope, the extended persistence context, JSF converters and so on.
我們可以根據(jù)某一個(gè)實(shí)體來(lái)搭建,或使用通配符讓Forge為每一個(gè)實(shí)體搭建。
[FeedbackEntry.java]$scaffold-generate --targets org.cedj.feedback.model.*;
一個(gè)命令,F(xiàn)orge就為FeedbackEntry和Author生成了配置文件(web.xml, faces-config.xml, …), JSF頁(yè)面,為布局生成了圖片,CSS以及加入了Bootstrap.
默認(rèn)Forge使用JSF 2.0搭建一個(gè)web應(yīng)用,當(dāng)你可執(zhí)行faces-setup命令來(lái)改變這個(gè)配置。事實(shí)上,大多數(shù)Forge命令可以被setup (e.g. jpa-setup, servlet-setup…)
$ faces-setup --facesVersion 2.2
八、 創(chuàng)建Arquillian 測(cè)試
八、 創(chuàng)建Arquillian 測(cè)試
Arquillian是一個(gè)針對(duì)JVM的創(chuàng)新的、高擴(kuò)展測(cè)試平臺(tái),它能使開(kāi)發(fā)人員輕易為Java中間件創(chuàng)建自動(dòng)化集成、功能性和驗(yàn)收測(cè)試。 接手單元測(cè)試留下的工作,Arquillian處理所有容器管理、部署和框架初始化,這樣你就能集中在手中的任務(wù),寫(xiě)測(cè)試。 真正的測(cè)試(應(yīng)該指的是不用Mock的方式)。簡(jiǎn)而言之,Arquillian brings the test to the runtime so you don‘t have to manage the runtime from the test (or the build). Arquillian通過(guò)覆蓋測(cè)試執(zhí)行的所有方面來(lái)去掉了這個(gè)負(fù)擔(dān),測(cè)試執(zhí)行過(guò)程包括:
管理容器的生命周期
Bundling the test case, dependent classes and resources into a ShrinkWrap archive (or archives)
Deploying the archive (or archives) to the container (or containers)
Enriching the test case by providing dependency injection and other declarative services
Executing the tests inside (or against) the container
Capturing the results and returning them to the test runner for reporting
為了避免引入不必要的復(fù)雜性到開(kāi)發(fā)人員的構(gòu)建環(huán)境, Arquillian 無(wú)縫集成了熟悉的測(cè)試框架(比如JUnit 4, TestNG 5), 運(yùn)行使用存在的IDE、Ant和Maven測(cè)試插件來(lái)啟動(dòng)測(cè)試(不用任何插件)。
就像安裝wildfly插件一樣,在Forge中使用Arquillian能力只需要安裝一個(gè)插件。最簡(jiǎn)單的安裝方法是在Forge console中執(zhí)行命令直接從Git庫(kù)中安裝
$addon-install-from-git --url https://github.com/forge/addon-arquillian.git --coordinate org.arquillian.forge:arquillian-addon
連接到插件庫(kù),抓取請(qǐng)求插件的最新版本,構(gòu)建源代碼,把二進(jìn)制文件安裝到當(dāng)前運(yùn)行時(shí)。因?yàn)镕orge是在一個(gè)模塊化類加載架構(gòu)上構(gòu)建的,我們能在不重啟進(jìn)程,也不需要考慮沖突依賴的情況下加載插件。
Arquillian安裝好之后,我們可以訪問(wèn)arquillian命令了。安裝成功后輸入arq按TAB鍵就能看到arquillian-setup命令。Arquillian支持多個(gè)容器中的測(cè)試。這是通過(guò)為每一個(gè)容器使用一個(gè)Maven profile來(lái)實(shí)現(xiàn)的。這樣我們也能同時(shí)配置多個(gè)容器了。
先讓Forge添加POM的依賴,這樣我們就能在wildfly容器上運(yùn)行Arquillianr測(cè)試了:
$arquillian-setup --containerType REMOTE --containerName JBOSS_AS_REMOTE_7.X --testframework //書(shū)上的命令,下面的是修改過(guò)的命令
【$ arquillian-setup --arquillianVersion 1.1.5.Final --testFramework junit --testFrameworkVersion 4.11 --containerAdapter wildfly-remote --containerAdapterVersion 8.1.0.Final,這個(gè)命令會(huì)在pom.xml中添加運(yùn)行Arquillian測(cè)試所有需要的依賴 (JUnit, Arquillian core, Arquillian extension for WildFly) 還有Maven Profile (上面的命令生成的是arquillian-wildfly-remote) 。This command has also created an arquillian.xml file where all the Arquillian configuration goes. As you can see, with a single command, JBoss Forge has dealt with all the plumbing configuration.】
需要選擇相應(yīng)配置
POM配置會(huì)做相應(yīng)修改,創(chuàng)建寫(xiě)測(cè)試的出發(fā)點(diǎn):
$ arquillian-create-test --targets org.cedj.ch03.feedback.model.FeedbackEntry
注:在win 7 64位上使用Forge 2.19命令行時(shí)發(fā)現(xiàn)鍵盤(pán)上下鍵出現(xiàn)亂碼,還不清楚是不是環(huán)境原因。
這個(gè)類沒(méi)有引用任何應(yīng)用服務(wù)器或目標(biāo)容器。因?yàn)?/span>Arquillian被設(shè)計(jì)來(lái)從目標(biāo)運(yùn)行時(shí)中解耦出測(cè)試的編程模型;任何能處理測(cè)試要求能力的容器都能工作。這能使Java EE的可移植性目標(biāo)不受到影響,把啟動(dòng)和部署的結(jié)構(gòu)移到配置元素中。 In this case, the Arquillian runner會(huì)發(fā)現(xiàn)wildfly容器adaptor在編譯路徑上(因?yàn)檫\(yùn)行
Arquillian Forge插件的setup命令的時(shí)候,adapter被定義在POM)
生成的FeedbackEntry類中可看到 @RunWith(Arquillian.class)
@RunWith是一個(gè)標(biāo)準(zhǔn)的JUnit構(gòu)件用來(lái)把控制指向特定的test runner.這是Arquillian的入口;從這里Arquillian可以從JUnit收獲生命周期事件,然后自己處理。這樣設(shè)計(jì)的好處是,就用戶而言Arquillian不需要特殊的插件或配置。 任何能啟動(dòng)JUnit測(cè)試的—可以是Maven build, an Ant task, a manual command,or an IDE—都能利用 Arquillian 而無(wú)需額外的處理。For instance, you can use JBDS and Eclipse to launch a full-scale integration test with Arquillian by right-clicking on the class and selecting Run As → JUnit Test.
public class FeedbackEntryTest {...}
The important bit here is what’s not required. Because of the Arquillian JUnit Test Runner, you’re free to use whatever class hierarchy you’d like, and there’s no need to extend a base support class. This keeps Arquillian tests in line with the POJO programming model originally introduced in Java EE5.
要讓測(cè)試類運(yùn)行,首先確保WildFly安裝、運(yùn)行。
安裝JBoss AS Forge addon
安裝Wildfly插件:
$ addon-install-from-git --url https://github.com/jerr/as-addon --coordinate org.jboss.forge.addon:as,2.0.0-SNAPSHOT
$addon-install-from-git --url https://github.com/jerr/jboss-as-addon --coordinate org.jboss.forge.addon:jboss-as-wf8,2.0.0-SNAPSHOT
$ as-setup --server wildfly8
需要下載一段時(shí)間,安裝成功后,可以看到as-的一些命令
$ as-
as-deploy as-setup as-shutdown as-start as-undeploy
接著構(gòu)建應(yīng)用,使用as-start啟動(dòng)JBOSS,使用as-deploy部署應(yīng)用:
$ build
$ as-start
(...)
JBoss logs
(...)
$ as-deploy
現(xiàn)在可在localhost:8080/feedback看見(jiàn)應(yīng)用了。
也可以跑arquillian測(cè)試了:mvn install -Parquillian-wildfly-remote【這里我直接另外開(kāi)了一個(gè)console,運(yùn)行maven命令,-P后面的參數(shù)是之前在pom.xml中生成的profile】
posted on 2015-09-23 21:14 yuxh 閱讀(4418) 評(píng)論(0) 編輯 收藏 所屬分類: j2ee