code_prettify

2015年6月12日 星期五

Eclipse中用 Jetty進行 webapp開發

....Jetty是一個純粹的基於Java網頁伺服器Java Servlet容器...
參考 wiki
想用她主要是看上她的輕量

Jetty官網上提到 Jetty跟 Eclipse整合有三種方式:
1.WTP
最多問題的方式,要用WTP,先問問看自己人品夠不夠好,平常香燒得夠不夠.對歹命郎來說不考慮.
2.embbeded
Jetty是純 Java開發的,另一個方法就是直接把 Jetty嵌到自己的程式裡.目前沒有這種需求,現有的需求不允許這樣做,再說再研究
3.run-jetty-run
webapp是既存的 project,需求只是希望平常的開發可以在 jetty測試. run-jetty-run是 eclipse 的一個 plug-in,可以透過下拉選單 Run>Run As或是在 project上右鍵> Run As在 Jetty上執行 webapp


所以,就開始來研究 run-jetty-run(以下簡稱 rjr)唄


1. 安裝
Eclipse menu bar Help> Install New Software...
Work with: 輸入http://run-jetty-run.googlecode.com/svn/trunk/updatesite(按 Add可存起來)


我是用下面那個 RunJettyRun 1.3(1.3.2),改天升級上面那個 RunJettyRun(1.3.3)測測看有沒有問題
老步驟, agree license, allow install,安裝完畢後 restart
restart後 Run> Run As就會多出 Run Jetty可以用了,在 Jetty中啟動既有專案的方式見圖一


2. JNDI設定
這個專案用 JNDI設定 DataSource, 因此須要做一些額外的設定,才能在 Jetty正常執行
  • 啟用 rjr的 JNDI支援:

下拉選單 Run> Run Configurations> Jetty Webapp> {your project}> Jetty tab
(project用 rjr執行過,雖然失敗,但會有記錄)
勾選 Show Advanced Options
再勾選 JNDI Support


  • 設定 DataSource:

rjr支援 jetty plus(讀取 /WEB-INF下的額外設定檔),所以在 /WEB-INF下新增一個 jetty-env.xml的檔案,內容範例
Jetty 6
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
<New id="ds" class="org.mortbay.jetty.plus.naming.Resource">
<Arg>jdbc/SQLDataSource</Arg>
<Arg>
<New class="org.apache.commons.dbcp.BasicDataSource">
<Set name="driverClassName">com.ibm.db2.jcc.DB2Driver</Set>
<Set name="url">your db jdbc url</Set>
<Set name="username">your db username</Set>
<Set name="password">your db password</Set>
</New>
</Arg>
</New>

<New id="ds2" class="org.mortbay.jetty.plus.naming.Resource">
<Arg>AnotherDataSource</Arg>
<Arg>
<New class="org.apache.commons.dbcp.BasicDataSource">
<Set name="driverClassName">com.ibm.db2.jcc.DB2Driver</Set>
<Set name="url">your db jdbc url</Set>
<Set name="username">your db username</Set>
<Set name="password">your db password</Set>
</New>
</Arg>
</New>

</Configure>

Jetty 8
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<New id="ds" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg>jdbc/SQLDataSource</Arg>
<Arg>
<New class="org.apache.commons.dbcp.BasicDataSource">
<Set name="driverClassName">com.ibm.db2.jcc.DB2Driver</Set>
<Set name="url">your db jdbc url</Set>
<Set name="username">your db username</Set>
<Set name="password">your db password</Set>
</New>
</Arg>
</New>

<New id="ds2" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg>AnotherDataSource</Arg>
<Arg>
<New class="org.apache.commons.dbcp.BasicDataSource">
<Set name="driverClassName">com.ibm.db2.jcc.DB2Driver</Set>
<Set name="url">your db jdbc url</Set>
<Set name="username">your db username</Set>
<Set name="password">your db password</Set>
</New>
</Arg>
</New>

<Get name="securityHandler">
<Set name="loginService">
<New class="org.eclipse.jetty.security.HashLoginService">
<Set name="name">Test Realm</Set>
<!-- <Set name="config">
<SystemProperty name="jetty.home" default="." />
/etc/realm.properties
</Set> -->
</New>
</Set>
</Get>

</Configure>

Jetty 6跟 Jetty 8的設定差在
1.Jetty的一些 class package不同
2.Jetty 6可以不設定 LoginService, Jetty 8必須設定 LoginService(設定一個"空"的就可以了)

更多設定請參照官網文件

  • 處理額外的 Jars

在這個範例中, commons-dbcp跟 db2 jdbc driver都不在 project的 web library中
需要且應該額外設定給 Jetty(佈署到正式環境時總不會希望連這些與 webapp無關的 jar也丟上去吧)
menu bar> Run> Run Configurations...> Webapp Classpath tab
點一下 User Custom classpath聚焦,旁邊那些 Add xxxx的按鈕就會 enable.
我的做法是另外開一個 folder把額外的 jar檔都放進去,然後用 Add External JARS...選中(可多選)須要的 jar檔全部拉進來


OK,做完這些, project順利啟動,一切功能執行正常,從此可以過著幸福快樂的日子...

  • 慢著,還少一個動作: 啟用程式碼異動掃瞄,不然的話改了程式也不會生效
menu bar> Run> Run Configurations...> Source Monitor List tab
勾選 Enable Scanner, 預設 5秒掃描一次
個人喜好取消勾選 Ignore .class file changes when run in Debug Mode
下面可以設定要監控哪些程式碼異動

2015.6-15 升級到 1.3.3,沒發現有甚麼問題
2015.6.15 http://eclipse-jetty.github.io/update有個基於 RJR的另一個 project,看來似乎比 RJR方便使用(最後更新日期比 RJR晚 :Q),支援到 Jetty 9

沒有留言: