tdott blog

ブログ アーカイブ

2009年4月20日月曜日

iTunesからClarionカーナビにファイル取り込み

iTunesのライブラリにある音楽ファイルをClarionのカーナビにインポートしようと思います。
Clarionのカーナビは
アーティスト名のフォルダ - アルバム名のフォルダ - 曲名のファイル
のようなフォルダ構造でインポートしなければなりません。

まずはiTunesでプレイリストを作成します。
それを右クリックして「プレイリストをエクスポート...」するとテキスト形式のリストが出力できます。
これを使ってClarion形式のフォルダ構造を作ることにします。

私の環境はWindows上のVirtualBox+Ubuntuなので、こんな感じのスクリプトになりました。
#!/bin/sh

# iTunesのプレイリスト(プレイリストを右クリックして「プレイリストをエクスポート...」)から
# Clarionのカーナビのファイルキャッチャー用のフォルダ構造を生成し、
# 音楽ファイルをコピーする。
#
# ファイルキャッチャー用のフォルダ構造は次の通り。
# アーティスト名のフォルダ - アルバム名のフォルダ - 曲名のファイル

if [ $# -ne 4 ];
then
echo "使用法: $0 list win_dir unix_dir out_dir"
echo " list"
echo " iTunesからエクスポートしたプレイリスト(txt形式)"
echo " win_dir"
echo " iTunesのmusicフォルダのwindowsパス"
echo " (このフォルダ直下にアーティスト名のフォルダが存在)"
echo " unix_dir"
echo " iTunesのmusicフォルダのunixパス(windowsから共有)"
echo " (このフォルダ直下にアーティスト名のフォルダが存在)"
echo " out_dir"
echo " ファイルのコピー先"
echo ""
echo "例: $0 お気に入り.txt d:/iTunes $HOME/.gvfs/iTunes@10.0.2.2 out"
exit
fi
if [ ! -e "$1" ];
then
echo "ファイルが存在しません: $1"
exit
fi
if [ ! -d "$3" ];
then
echo "ディレクトリが存在しません: $3"
exit
fi


list=$1
win_dir=$2
unix_dir=$3
out_dir=$4
tmp1=$(mktemp temp.XXXXXX)
tmp2=$(mktemp temp.XXXXXX)
tmp3=$(mktemp temp.XXXXXX)

# utf-8変換
nkf -w $list > $tmp1
# ヘッダ行を削除、レコードごとに改行、区切り文字を@@に変更、パス区切りを/に変更
sed -e"s/.*場所 //" -e "s/\(\.\(mp3\|wma\|m4a\)\) /\1\n/g" -e "s/\t/@@/g" -e "s_\\\_/_g" $tmp1 > $tmp2
# レコードからアーティスト名、アルバム名、曲名、音楽ファイルパスを抽出
gawk -F @@ '{print $2 "\n" $4 "\n" $1 "\n" $27}' $tmp2 > $tmp3

# ファイルを読む
exec 3< $tmp3
while read artist 0<&3
do
read album 0<&3
mkdir -p "$out_dir/$artist/$album"
read name 0<&3
read file 0<&3
file=$(echo $file | sed -e "s!$win_dir!$unix_dir!i")
filename=$(basename "$file")
filename=$(echo $filename | sed -e "s/^[0-9][0-9] //")
ext=$(echo $file | sed -e "s/.*[^.].*\.\([^.]*\)$/\1/")
if [ $ext = "mp3" -o $ext = "m4a" ];
then
echo "copying file..."
echo " from: $file"
echo " to: out/$artist/$album/$filename"
cp -T "$file" "out/$artist/$album/$filename"
fi
done
rm temp.*

iTunesバージョンが変わるとエクスポートされるテキストファイルのフォーマットが微妙に変わったりするので注意が必要です。
私は8.1.1.10で動作確認しました。

2009年3月17日火曜日

mavenからsite-deploy

SourceForgeのプロジェクトホームページにmavenで作成したドキュメントをアップロードします。

準備としてssh鍵を作成します。
OpenSSH形式、パスフレーズ無しで作成しないとmavenでは使えない(接続時にAuth failと言われる)ので注意。
$ ssh -t rsa


公開鍵をSourceForgeに登録します。
以下の結果をコピペ。
$ cat ~/.ssh/id_rsa.pub


mavenで接続する際のユーザー名を~/.m2/settings.xmlに設定します。
<settings>
<servers>
<server>
<id>sourceforge</id>
<username>tdott</username>
</server>
</servers>
</settings>


pom.xmlはこんな感じに。
<project>
...
<distributionManagement>
<site>
<id>sourceforge</id>
<url>scp://shell.sourceforge.jp/home/groups/i/it/itembook/htdocs</url>
</site>
</distributionManagement>
...
</project>


そしたらmaven実行で無事にデプロイ完了。
$ mvn site-deploy

2009年3月16日月曜日

mavenでプロジェクト作成

ひととおり環境ができて、SourceForgeにもプロジェクト登録できました。
まずはmavenでプロジェクトを作ります。

今回のはWebアプリケーションにするので、Webプロジェクトitembook-webと、コアモジュール用のプロジェクトitembook-coreを作成します。
$ mvn archetype:create -DgroupId=jp.sourceforge -DartifactId=itembook-web -DarchetypeArtifactId=maven-archetype-webapp
$ mvn archetype:create -DgroupId=jp.sourceforge -DartifactId=itembook-core -DarchetypeArtifactId=maven-archetype-quickstart


そしたらmavenのFAQにある通り、2つのプロジェクトを1つにまとめるpom.xmlを作成します。
How do I build more than one project at once?

問題なくmvn clean installでビルドができました。

2009年3月14日土曜日

趣味のプログラム

しばらくプログラムを書かない仕事をすることになりました。
ちょっと趣味のプログラムをやってみようと思います。

まずは開発環境作りということで。
PCはVistaなのですが、Cygwin+Meadowも面倒なので、VirtualBoxでUbuntuを使ってみることにします。

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がバージョンアップしたらこれも修正ですね。

2008年6月10日火曜日

Tomcat上でJBossSeamを動かす

Tomcat上でJBossSeamのサンプルを動かしてみます。

筆者の環境
  • JDK1.6.0_05
  • Tomcat6.0.16
  • Apache Ant1.7.0
  • Maven Ant Tasks2.0.9
  • JBoss Seam2.0.2.SP1
Maven Ant TasksはMaven ProjectからダウンロードしてAntのlibフォルダにコピーしておきます。

手順
※ $SEAM_HOMEはJBossSeamのフォルダ、$CATALINA_HOMEはTomcatのフォルダです。
$ cp $SEAM_HOME/lib/hsqldb.jar $CATALINA_HOME/lib
$ cd $SEAM_HOME/examples/jpa
$ ant tomcat6
$ cp dist-tomcat6/jboss-seam-jpa.war $CATALINA_HOME/webapps
これでサンプルのデプロイ完了です。
Tomcatを起動してhttp://localhost:8080/jboss-seam-jpa/をブラウザで開けばサンプルアプリケーションが表示されます。


Login NameとPasswordはともにdemoでログインできます。


次回は自作のサンプルを動かしてみます。

Tomcat上でEJB3を動かす

Embeddable EJB 3.0を使用してTomcat上でEJB3.0を動かしてみます。

筆者の環境
  • JDK1.6.0_05
  • Tomcat6.0.16
  • Eclipse 3.3.1.1

Embeddable EJB3.0をダウンロードして解凍します。
※Preview RC9はTomcatデプロイ時にエラーとなってしまうためRC8を取得してください。

まずはEmbeddable EJB3.0の動作確認を行います。


はじめにEmbeddable EJBのjarファイルをUser LibraryとしてEclipseに定義してしまいます。



EclipseでDynamic Web Projectを作成します。今回はプロジェクト名をEJB3OnTomcatにしました。
srcにEmbeddable EJB3.0のconfフォルダにあるファイルを全てコピーします。


ProjectのPropertiesのJava Build Pathで、Libraryに先ほど定義したEmbeddable EJBのライブラリを追加します。



さらにJ2EE Module DependenciesでもEmbeddable EJBのライブラリを選択します。



上記の操作が終わったらTomcatにデプロイして起動してみます。
例外が無く正常に起動できればOKです。ちょっと警告が出ますが、とりあえず気にしないでおきます。

次にプログラムを書きます。

まずはEJBのプログラムです。EJBはjarファイルにしてWEB-INF/libに配置する必要があるので、別プロジェクトに作成します。
EclipseでJava Projectを作成します。プロジェクト名はEJB3OnTomcatEJBにしました。
Webプロジェクトと同様に、ProjectのPropertiesのJava Build Pathで、Embeddable EJBのライブラリを追加します。

プロジェクトのsrcディレクトリに以下の4つのファイルを作成します。

META-INF/persistence.xml
永続化定義です。defaultの永続化機構をjava:/DefaultDSにマップします。java:/DefaultDSの定義は、Webプロジェクトのembedded-jboss-beans.xmlに記述してあります。
<?xml version="1.0" encoding="UTF-8"?>
<persistence>
<persistence-unit name="default">
<jta-data-source>java:/DefaultDS</jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
</properties>
</persistence-unit>
</persistence>


tekit/ejb3tomcat/ejb/Car.java
Entity Beanです。
package tekit.ejb3tomcat.ejb;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Car {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
private Integer price;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
}


tekit/ejb3tomcat/ejb/CarDAO.java
SessionBeanのインターフェイスです。
package tekit.ejb3tomcat.ejb;

import java.util.List;
import javax.ejb.Local;
import javax.ejb.Remote;

@Local
@Remote
public interface CarDAO {
public abstract void create(String name, Integer price);
public abstract List getList();
}


tekit/ejb3tomcat/ejb/CarDAOBean.java
SessionBeanの実装です。
package tekit.ejb3tomcat.ejb;

import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
public class CarDAOBean implements CarDAO{
@PersistenceContext
private EntityManager em;

public void create(String name, Integer price) {
Car car = new Car();
car.setName(name);
car.setPrice(price);
em.persist(car);
}

public List getList(){
return em.createQuery("select c from Car c").getResultList();
}
}



次にWebのプログラムを書きます。EJBを参照するのでProjectのPreferencesにて、J2EE Module Dependenciesの設定でEJB3OnTomcatEJBプロジェクトを選択します。


EJBを呼び出すロジックはJSPに書いてしまいます。
WebContent/index.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@page import="tekit.ejb3tomcat.ejb.Car"%>
<%@page import="java.util.Hashtable"%>
<%@page import="tekit.ejb3tomcat.ejb.CarDAO"%>
<%@page import="javax.naming.InitialContext"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Tomcat上でEJB3.0を動かすサンプル</title>
</head>
<body>

<%
// EJBを取得する
Hashtable<String, String> props = new Hashtable<String, String>();
props.put("java.naming.factory.initial", "org.jnp.interfaces.LocalOnlyContextFactory");
props.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
CarDAO dao = (CarDAO)new InitialContext(props).lookup("CarDAOBean/local");

// 作成ボタンからの遷移ならエンティティを作成する
if("create".equals(request.getParameter("command"))){
dao.create(request.getParameter("name"), new Integer(request.getParameter("price")));
}

// エンティティを列挙する
for(Car car : dao.getList()){
%>
<%= car.getName() %> / <%= car.getPrice() %><br/>
<%
}
%>

<form action="./index.jsp" method="post">
名前<input name="name" type="text"/>
価格<input name="price" type="text"/>
<input name="command" value="create" type="submit" title="作成"/>
</form>

</body>
</html>

以上でプログラムは終了です。


Tomcatにデプロイして実行してみると、こんな感じで動作確認できます。


アルファ版なのですがEntityBeanとSessionBeanを使う分には問題なさそうです。
非力なPCで開発する際にJBossが重い場合は、Tomcat+EJBで開発してみるのも良いかもしれませんね。

次はTomcat上でJBoss Seamを動かしてみます。