Seam on Jetty でさくさく開発

JBoss ToolsのSeam Web Projectを使えば簡単にIncremental Hot Deployが可能な構成で開発できるのだが、デフォルト状態のJBossだと起動がもっさりしててちょっとやだ。

どうせHot DeployでEJB使えないし開発環境用なんだから、もっと軽量のサーバでいいじゃんと思ってたところ、takezoeさんのところで紹介されていたrun-Jetty-runでJetty使うと幸せになれそうと思って試してみた。

  • 今回はJBossTools2.0.1.GAで試してます。Seamのバージョンも2.0.1.GAです。
  • JBossTools、Seam両方とも新しいバージョンが出てますが、たぶんそんなに変わっていないと思う。

以下、手順です。

環境の準備〜プロジェクトの作成・設定

  1. run-jetty-runをEclipseにインストールします。ここで配布されています。サイトにEclipseの更新サイトがあるので、普通にインストールしてEclipseを再起動します。
  2. Seam Web Projectのウィザードでプロジェクトを新規作成します。
    • 注意点は、WARプロジェクトとするくらい
  3. 設定ファイルをJetty用に変更します。
    • persistence.xmlを以下のように書き換えます(Jettyは素ではJTAが使えないので、JPAトランザクションタイプをRESOURCE_LOCALとします)
	<persistence-unit name="seamOnJetty"
		transaction-type="RESOURCE_LOCAL">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<properties>
			<property name="hibernate.dialect"
				value="org.hibernate.dialect.HSQLDialect" />
			<property name="hibernate.connection.driver_class"
				value="org.hsqldb.jdbcDriver" />
			<property name="hibernate.connection.username" value="sa" />
			<property name="hibernate.connection.password" value="" />
			<property name="hibernate.connection.url"
				value="jdbc:hsqldb:." />
			<property name="hibernate.hbm2ddl.auto" value="update" />
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.format_sql" value="true" />
		</properties>
	</persistence-unit>
    • WebContent/WEB-INF/components.xmlに以下のようにentity-transactionの設定をを加えます(xmlnsでtransactionの名前空間を追加するのを忘れないように)。
<?xml version="1.0" encoding="UTF-8"?>
<components xmlns="http://jboss.com/products/seam/components"
            xmlns:core="http://jboss.com/products/seam/core"
            xmlns:persistence="http://jboss.com/products/seam/persistence"
            xmlns:drools="http://jboss.com/products/seam/drools"
            xmlns:bpm="http://jboss.com/products/seam/bpm"
            xmlns:security="http://jboss.com/products/seam/security"
            xmlns:mail="http://jboss.com/products/seam/mail"
            xmlns:transaction="http://jboss.com/products/seam/transaction"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation=
                "http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.0.xsd 
                 http://jboss.com/products/seam/persistence http://jboss.com/products/seam/persistence-2.0.xsd 
                 http://jboss.com/products/seam/drools http://jboss.com/products/seam/drools-2.0.xsd
                 http://jboss.com/products/seam/bpm http://jboss.com/products/seam/bpm-2.0.xsd
                 http://jboss.com/products/seam/security http://jboss.com/products/seam/security-2.0.xsd
                 http://jboss.com/products/seam/mail http://jboss.com/products/seam/mail-2.0.xsd
                 http://jboss.com/products/seam/transaction http://jboss.com/products/seam/transaction-2.0.xsd
                 http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.0.xsd">

   <transaction:entity-transaction entity-manager="#{entityManager}"/>

   (以下、省略)

Jettyの実行設定

  1. プロジェクトを選択し、右クリック->[Run As]->[Open Run Dialog]を選択する。
  2. Jetty Webappを選択し、右クリック->[New]を選択する。
  3. Jettyの起動設定ページが開くので、[Context]に適当なコンテキストルートを入力、[WebApp]にWEB-INFフォルダを格納しているフォルダを指定する(デフォルトの設定でSeam Web Projectを作成している場合は、WebContentです)。
  4. 次に、Classpathタブをクリックしてページを開きます。ここでちょっとクラスパスの設定で工夫が必要となります。
  5. User Entriesに登録されている自分のプロジェクトを選択し、Removeボタンをクリックして削除します。
  6. User Entriesを選択し、Advancedボタンをクリックします。
  7. 開いたダイアログで、Add Libraryを選択してOKボタンをクリックする。
  8. Server Runtimeを選択してNextボタンをクリックする。
  9. JBoss 4.2 Runtimeを選択してFinishボタンをクリックする。すると、User EntriesにJBossのランタイムが追加されます。
  10. 再び、User Entriesを選択し、Advancedボタンをクリックします。
  11. Add Folderを選択してOKボタンをクリックする。
  12. プロジェクト名/build/classesを選択し、OKボタンをクリックします。これでUser Entriesにclassesフォルダが追加されます。ここまでの設定で以下のようになっているはず。http://img.skitch.com/20080604-e7wgfyqwse3eqmqwec1pu7ucxp.png
  13. 以上で設定完了なので、Applyボタンをクリックして保存します。

Jettyの実行

  1. 前の設定画面でそのままRunボタンをクリックすると、Jettyが起動します。コンソールに以下のように出れば起動完了です! 私のMacBookだとSeamの初期化も含めて7秒くらいで起動完了とかなり速い!!

(ちなみにJBoss4.2.2.GAのdefaultサーバだと、27s:120msでした。かなり違うね。。。)

2008-06-05 01:51:38.895::INFO:  Logging to STDERR via org.mortbay.log.StdErrLog
2008-06-05 01:51:38.05::INFO:  jetty-6.1.6
2008/06/05 1:51:43 com.sun.faces.config.ConfigureListener contextInitialized
情報: Initializing Sun's JavaServer Faces implementation (1.2_04-b16-p02) for context '/seamOnJetty'
2008/06/05 1:51:43 com.sun.faces.spi.InjectionProviderFactory createInstance
情報: JSF1048: PostConstruct/PreDestroy annotations present.  ManagedBeans methods marked with these annotations will have said annotations processed.
2008-06-05 01:51:44.661::INFO:  Started SelectChannelConnector@0.0.0.0:8080

もちろん、このJetty上でSeamのIncremental Hot Deployも利用可能です。