ブログ アーカイブ

2008年6月12日木曜日

seam-genで作成したJBossSeamをTomcat上で動かす

JBossToolsを使うという手もありますが、まずは基本のseam-genから試してみます。
JBossAS上で動くのは当たり前なので、今回はTomcat上で動かしてみます。

筆者の環境
  • JDK1.6.0_05
  • Tomcat6.0.16
  • Apache Ant1.7.0
  • JBoss Seam2.0.2.SP1
seam-genで作成したプロジェクトをそのままビルドした場合、JBossASでは動作しますがTomcatでは動作しません。Tomcatで動作させるためには、seam-genで作成されたプロジェクトにちょっと手を加える必要があります。

簡単にまとめると以下のような変更が必要です。
  • Embeddable EJB3.0を追加
  • JPAのトランザクションをJTAからRESOURCE_LOCALに変更
  • いくつかのjarファイルをTomcatに配置

まずはseam-genします。
途中でearプロジェクトなのかwarプロジェクトなのか聞かれますのでearプロジェクトを選択してください。他は通常通りでOKです。

できあがったプロジェクトに手を加えます。
日本語で説明するよりソースで説明した方がわかりやすいのでAntのbuild.xmlを書きます。
別ファイルにすべき内容もbuild.xmlに含まれているので長くなっていますが、そんなに難しくありません。ファイルをコピーしたり書き換えたりしているだけです。
<?xml version="1.0" encoding="utf-8"?>
<!--
JBoss Seam 2.0.2.SP1 にてseam-genで作成したearプロジェクトをTomcatで利用できるように変更します。

利用前の準備:
Tomcatのlibフォルダに下記のモジュールをコピーしてください。
jboss-embedded-all.jar : プロジェクトのlib/testフォルダにあります。
log4j.jar : プロジェクトのlibフォルダにあります。
hsqldb.jar (HSQLDBを使用する場合) : プロジェクトのlibフォルダにあります。
このファイルの冒頭にあるpropertyを環境に合わせて設定してください。

注意:
このbuild.xmlの実行は、seam-genでプロジェクトを作成した直後に行なってください。
またデータソース定義はデフォルトでHSQLDBの定義を作成していますので、
実行後に環境に合わせてresources/META-INF/persistence-tomcat.xmlを編集してください。

ターゲット:
ant all :プロジェクトをTomcatで利用できるように変更します。
ant remove :プロジェクトへの変更を元に戻します(tomcat用の情報が削除されます)。

解説:
変更後のプロジェクトでは、build.xmlのprofileをtomcatに設定することでTomcat用のビルドが実行されるようになります。
Tomcat用のデータソース定義はresources/META-INF/persistence-tomcat.xmlに記述してください。
また、resources/WEB-INF/components.xml、deployed-jars-war.listがprofile別に定義するように変更されていますので注意してください。
Tomcatへデプロイする場合はdeployターゲットを使用してください。explodeターゲットは使用できません。
-->
<project default="all">

<!-- 環境に合わせて設定する -->
<property name="project.name" value="SeamOnTomcat"/>
<property name="project.home" location="../SeamOnTomcat"/>
<property name="tomcat.home" location="/home/app/apache-tomcat-6.0.16"/>

<!-- 以下は変更不要 -->
<property name="ejb.url" value="http://jaist.dl.sourceforge.net/sourceforge/jboss/jboss-EJB-3.0_Embeddable_ALPHA_8-patch2.zip"/>
<property name="ejb.file" location="${tmp.dir}/jboss-embeddable-ejb.zip"/>
<property name="ejb.dir" location="${tmp.dir}/jboss-embeddable-ejb.zip"/>

<target name="all" depends="prepare-ejb,prepare-profiles,patch-build-xml"
description="seam-genで生成したearプロジェクトをTomcat用にビルドできるようにします。"/>

<target name="remove"
description="allターゲットで行なったプロジェクトへの変更を元に戻します。">
<delete file="${project.home}/lib/jboss-ejb3-all.jar"/>
<delete file="${project.home}/lib/thirdparty-all.jar"/>
<delete dir="${project.home}/resources/tomcat"/>
<delete file="${project.home}/build-tomcat.properties"/>
<delete file="${project.home}/deployed-jars-war-prod.list"/>
<delete file="${project.home}/deployed-jars-war-dev.list"/>
<delete file="${project.home}/deployed-jars-war-tomcat.list"/>
<delete file="${project.home}/resources/import-tomcat.sql"/>
<delete file="${project.home}/resources/META-INF/persistence-tomcat.xml"/>
<delete file="${project.home}/resources/WEB-INF/components-prod.xml"/>
<delete file="${project.home}/resources/WEB-INF/components-dev.xml"/>
<delete file="${project.home}/resources/WEB-INF/components-tomcat.xml"/>
<move file="${project.home}/build.xml.bak" tofile="${project.home}/build.xml"/>
</target>

<target name="prepare-ejb"
description="JBoss Embeddable EJBのモジュールをプロジェクトにコピーします。">

<!-- jarファイルを取得 -->
<mkdir dir="./tmp/ejb"/>
<get src="${ejb.url}" dest="./tmp/ejb.zip"/>
<unzip src="./tmp/ejb.zip" dest="./tmp/ejb"/>

<!-- コピー -->
<copy todir="${project.home}/lib" flatten="true">
<fileset dir="./tmp/ejb">
<include name="*/lib/jboss-ejb3-all.jar"/>
<include name="*/lib/thirdparty-all.jar"/>
</fileset>
</copy>
<copy todir="${project.home}/resources/tomcat" flatten="true">
<fileset dir="./tmp/ejb">
<include name="*/conf/*.*"/>
<exclude name="*/conf/log4j.xml"/>
</fileset>
</copy>

</target>

<target name="prepare-profiles"
description="tomcat用のprofileを作成します。">

<!-- build.xml -->
<copy file="${project.home}/build-dev.properties" tofile="${project.home}/build-tomcat.properties" overwrite="true"/>

<!-- build.properties -->
<echo file="${project.home}/build-tomcat.properties" append="true">tomcat.home=${tomcat.home}
deploy.dir=$${tomcat.home}/webapps
war.deploy.dir=$${deploy.dir}/$${project.name}
</echo>
<replace file="${project.home}/build-tomcat.properties" token="\" value="/"/>

<!-- deployed-jars-war.list -->
<copy file="${project.home}/deployed-jars-war.list" tofile="${project.home}/deployed-jars-war-prod.list"/>
<copy file="${project.home}/deployed-jars-war.list" tofile="${project.home}/deployed-jars-war-dev.list"/>
<echo file="${project.home}/deployed-jars-war-tomcat.list">antlr-runtime.jar
commons-beanutils.jar
commons-digester.jar
core.jar
drools-compiler.jar
drools-core.jar
janino.jar
jboss-el.jar
jboss-seam.jar
jboss-seam-*.jar
jbpm-jpdl.jar
jsf-facelets.jar
mvel14.jar
richfaces-api.jar
richfaces-impl.jar
richfaces-ui.jar
javassist.jar
dom4j.jar
hibernate*.jar
jsf*.jar
commons-logging.jar
commons-collections.jar
lucene-core.jar
jboss-ejb3.jar
thirdparty-all.jar</echo>

<!-- import.sql -->
<copy file="${project.home}/resources/import-dev.sql" tofile="${project.home}/resources/import-tomcat.sql"/>

<!-- persistence.xml -->
<echo file="${project.home}/resources/META-INF/persistence-tomcat.xml"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<!-- Persistence deployment descriptor for dev profile -->
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">

<persistence-unit name="${project.name}" 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"/>
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/>
</properties>
</persistence-unit>

</persistence>]]></echo>

<!-- components.xml -->
<copy file="${project.home}/resources/WEB-INF/components.xml" tofile="${project.home}/resources/WEB-INF/components-prod.xml"/>
<copy file="${project.home}/resources/WEB-INF/components.xml" tofile="${project.home}/resources/WEB-INF/components-dev.xml"/>
<echo file="${project.home}/resources/WEB-INF/components-tomcat.xml"><![CDATA[<?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:transaction="http://jboss.com/products/seam/transaction"
xmlns:security="http://jboss.com/products/seam/security"
xmlns:mail="http://jboss.com/products/seam/mail"
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/components http://jboss.com/products/seam/components-2.0.xsd">

<core:init debug="@debug@" jndi-pattern="@jndiPattern@"/>

<core:manager concurrent-request-timeout="500"
conversation-timeout="120000"
conversation-id-parameter="cid"
parent-conversation-id-parameter="pid"/>

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

<persistence:managed-persistence-context name="entityManager"
auto-create="true"
entity-manager-factory="#{${project.name}EntityManagerFactory}"/>

<persistence:entity-manager-factory name="${project.name}EntityManagerFactory"
persistence-unit-name="${project.name}"/>

<drools:rule-base name="securityRules">
<drools:rule-files>
<value>/security.drl</value>
</drools:rule-files>
</drools:rule-base>

<security:identity security-rules="#{securityRules}" authenticate-method="#{authenticator.authenticate}" remember-me="true"/>

<event type="org.jboss.seam.security.notLoggedIn">
<action execute="#{redirect.captureCurrentView}"/>
</event>
<event type="org.jboss.seam.security.loginSuccessful">
<action execute="#{redirect.returnToCapturedView}"/>
</event>

<mail:mail-session host="localhost" port="2525" username="test" password="test" />

<!-- For use with jBPM pageflow or process management -->
<!--
<bpm:jbpm>
<bpm:process-definitions></bpm:process-definitions>
<bpm:pageflow-definitions></bpm:pageflow-definitions>
</bpm:jbpm>
-->

</components>]]></echo>

</target>

<target name="patch-build-xml"
description="build.xmlをTomcatビルド用に変更します。">

<!-- patchファイルを作成 -->
<echo file="./tmp/build.xml.patch"><![CDATA[***************
*** 5,15 ****
<!-- Give user a chance to override without editing this file or typing -D -->
<property file="$${basedir}/build.properties" />

- <property name="profile" value="dev" />
- <property file="build-$${profile}.properties" />
-
<!-- set global properties for this build -->
<property name="project.name" value="${project.name}"/>
<property name="dist.dir" value="dist" />
<property name="src.model.dir" value="src/model" />
<property name="src.action.dir" value="src/action" />
--- 5,19 ----
<!-- Give user a chance to override without editing this file or typing -D -->
<property file="$${basedir}/build.properties" />

<!-- set global properties for this build -->
<property name="project.name" value="${project.name}"/>
+
+ <property name="profile" value="tomcat" />
+ <condition property="is.tomcat">
+ <equals arg1="$${profile}" arg2="tomcat"/>
+ </condition>
+ <property file="build-$${profile}.properties" />
+
<property name="dist.dir" value="dist" />
<property name="src.model.dir" value="src/model" />
<property name="src.action.dir" value="src/action" />
***************
*** 97,117 ****
overwrite="true"/>
</target>

! <target name="war" depends="compile"
description="Build the distribution .war file">
<copy todir="$${war.dir}">
<fileset dir="$${basedir}/view" />
</copy>
<copy todir="$${war.dir}/WEB-INF">
<fileset dir="$${basedir}/resources/WEB-INF">
<include name="*.*"/>
<include name="classes/**/*.*"/>
<exclude name="classes/**/*.class"/>
</fileset>
- <filterset>
- <filter token="debug" value="$${debug}" />
- <filter token="jndiPattern" value="$${project.name}/#{ejbName}/local" />
- </filterset>
</copy>
<copy todir="$${war.dir}/WEB-INF">
<fileset dir="$${basedir}/resources/WEB-INF">
--- 101,135 ----
overwrite="true"/>
</target>

! <target name="war-tomcat" depends="archive-jboss" if="is.tomcat">
! <copy todir="$${war.dir}.tomcat">
! <fileset dir="$${war.dir}"/>
! </copy>
! <copy todir="$${war.dir}.tomcat/WEB-INF/lib" file="$${dist.dir}/$${project.name}.jar"/>
! </target>
!
! <target name="war-jboss" depends="compile" unless="is.tomcat"
description="Build the distribution .war file">
<copy todir="$${war.dir}">
<fileset dir="$${basedir}/view" />
</copy>
+ <copy todir="$${war.dir}/WEB-INF/classes" failonerror="false">
+ <fileset dir="$${basedir}/resources/$${profile}"/>
+ </copy>
+ <copy file="$${basedir}/resources/WEB-INF/components-$${profile}.xml"
+ tofile="$${war.dir}/WEB-INF/components.xml">
+ <filterset>
+ <filter token="debug" value="$${debug}" />
+ <filter token="jndiPattern" value="$${project.name}/#{ejbName}/local" />
+ </filterset>
+ </copy>
<copy todir="$${war.dir}/WEB-INF">
<fileset dir="$${basedir}/resources/WEB-INF">
<include name="*.*"/>
<include name="classes/**/*.*"/>
<exclude name="classes/**/*.class"/>
+ <exclude name="components*.xml"/>
</fileset>
</copy>
<copy todir="$${war.dir}/WEB-INF">
<fileset dir="$${basedir}/resources/WEB-INF">
***************
*** 121,127 ****
</copy>
<copy todir="$${war.dir}/WEB-INF/lib">
<fileset dir="$${lib.dir}">
! <includesfile name="deployed-jars-war.list" />
<exclude name="jboss-seam-gen.jar" />
</fileset>
</copy>
--- 139,145 ----
</copy>
<copy todir="$${war.dir}/WEB-INF/lib">
<fileset dir="$${lib.dir}">
! <includesfile name="deployed-jars-war-$${profile}.list" />
<exclude name="jboss-seam-gen.jar" />
</fileset>
</copy>
***************
*** 132,137 ****
--- 150,157 ----
</copy>
</target>

+ <target name="war" depends="war-tomcat,war-jboss"/>
+
<target name="ear" description="Build the EAR">
<copy todir="$${ear.dir}">
<fileset dir="$${basedir}/resources">
***************
*** 156,162 ****
</copy>
</target>

! <target name="archive" depends="jar,war,ear"
description="Package the archives">
<jar jarfile="$${dist.dir}/$${project.name}.jar" basedir="$${jar.dir}"/>
<jar jarfile="$${dist.dir}/$${project.name}.war" basedir="$${war.dir}"/>
--- 176,186 ----
</copy>
</target>

! <target name="archive-tomcat" depends="war-tomcat" if="is.tomcat">
! <jar jarfile="$${dist.dir}/$${project.name}-tomcat.war" basedir="$${war.dir}.tomcat"/>
! </target>
!
! <target name="archive-jboss" depends="jar,war-jboss,ear" unless="is.tomcat"
description="Package the archives">
<jar jarfile="$${dist.dir}/$${project.name}.jar" basedir="$${jar.dir}"/>
<jar jarfile="$${dist.dir}/$${project.name}.war" basedir="$${war.dir}"/>
***************
*** 168,174 ****
</fileset>
</jar>
</target>
!
<target name="datasource">
<fail unless="jboss.home">jboss.home not set</fail>
<copy todir="$${deploy.dir}">
--- 192,200 ----
</fileset>
</jar>
</target>
!
! <target name="archive" depends="archive-tomcat,archive-jboss" />
!
<target name="datasource">
<fail unless="jboss.home">jboss.home not set</fail>
<copy todir="$${deploy.dir}">
***************
*** 210,230 ****
<touch file="$${ear.deploy.dir}/META-INF/application.xml"/>
</target>

! <target name="deploy" depends="archive,datasource" description="Deploy to JBoss AS">
<fail unless="jboss.home">jboss.home not set</fail>
<copy todir="$${deploy.dir}" file="$${dist.dir}/$${project.name}.ear" />
</target>

! <target name="undeploy" description="Undeploy the example from JBoss">
<delete file="$${deploy.dir}/$${project.name}.ear" />
<delete file="$${deploy.dir}/$${project.name}-dev-ds.xml" />
<delete file="$${deploy.dir}/$${project.name}-prod-ds.xml" />
</target>

<target name="clean" description="Cleans up the build directory">
<delete dir="$${dist.dir}"/>
<delete dir="$${ear.dir}"/>
<delete dir="$${war.dir}"/>
<delete dir="$${jar.dir}"/>
<delete dir="$${src.schema.dir}" failonerror="no"/>
<delete dir="$${basedir}/test-report"/>
--- 236,270 ----
<touch file="$${ear.deploy.dir}/META-INF/application.xml"/>
</target>

! <target name="deploy-tomcat" depends="archive-tomcat" if="is.tomcat">
! <copy tofile="$${deploy.dir}/$${project.name}.war" file="$${dist.dir}/$${project.name}-tomcat.war" />
! </target>
!
! <target name="deploy-jboss" depends="archive,datasource" unless="is.tomcat" description="Deploy to JBoss AS">
<fail unless="jboss.home">jboss.home not set</fail>
<copy todir="$${deploy.dir}" file="$${dist.dir}/$${project.name}.ear" />
</target>

! <target name="deploy" depends="deploy-tomcat,deploy-jboss" />
!
! <target name="undeploy-tomcat" if="is.tomcat">
! <echo>$${deploy.dir}</echo>
! <delete file="$${deploy.dir}/$${project.name}.war" />
! </target>
!
! <target name="undeploy-jboss" unless="is.tomcat" description="Undeploy the example from JBoss">
<delete file="$${deploy.dir}/$${project.name}.ear" />
<delete file="$${deploy.dir}/$${project.name}-dev-ds.xml" />
<delete file="$${deploy.dir}/$${project.name}-prod-ds.xml" />
</target>

+ <target name="undeploy" depends="undeploy-tomcat,undeploy-jboss"/>
+
<target name="clean" description="Cleans up the build directory">
<delete dir="$${dist.dir}"/>
<delete dir="$${ear.dir}"/>
<delete dir="$${war.dir}"/>
+ <delete dir="$${war.dir}.tomcat"/>
<delete dir="$${jar.dir}"/>
<delete dir="$${src.schema.dir}" failonerror="no"/>
<delete dir="$${basedir}/test-report"/>
]]></echo>

<!-- 元のファイルをバックアップ -->
<copy file="${project.home}/build.xml" tofile="${project.home}/build.xml.bak"/>

<!-- build.xmlにpatch -->
<patch patchfile="./tmp/build.xml.patch" originalfile="${project.home}/build.xml"/>

</target>

</project>

あまり情報が無いので試行錯誤でしたが何とかできました。
Seamがバージョンアップしたらこれも修正ですね。

0 件のコメント: