unnamed

Javaとか、http://twitter.com/sugarlife

Apache TomEE 事始め

この記事は Java EE Advent Calendar 2012 の5日目です!

Apache TomEE

Apache TomEEは去年のJavaOne 2011で発表された、TomcatベースのJava EE 6 (Web Profile)対応のJava EEアプリケーションサーバです。とみーと読みます。
これにRESTfulなWebを作るのに必須なJAX-RSを載せたJAX-RS版とみー君もいます。また、Certifitedではありませんが、Full Profileに近づけた機能を持つとみーぷらす (TomEE Plus) というものもあります。
必要に応じて使いやすいとみー君を選ぶことができます。それぞれの違いはここの比較表が解りやすいです。

華々しい(?)発表の後はあまり進展のない日々が続きましたが、今年のJavaOne 2012前にバージョン1.5がリリースされました。以前は手持ちのJavaEE6サンプルが一発で動かなかった&NetBeansで動かなかったため、TomcatにOpenXXXをつなぎ合わせた『ふらんけん』状態なのかと思い、そっと閉じた経験があったのですが改めて見ていきたいと思います。

TomEEのインストール

落として、解凍。おわり。tomcatと一緒ですね。簡単な動かし方としては、以下の通りに実行できます。

  • 実行する:bin/startup.sh
  • デプロイする:bin/tomee.sh deploy
  • 終了する:bin/shutdown.sh

Web管理コンソールはTomcatと一緒で、http://localhost:8080にアクセスすると確認できます。ポートは tomcatと同様に conf/server.xml を書き換えることで変更できます。

NetBeansでTomEE

次にNetBeansでTomEEを動かします。

  1. サービスタブ > サーバー > 右クリック > サーバを追加
  2. サーバーを選択
    1. Apache Tomcat を選択。
  3. インストールとログインの詳細
    1. サーバーの場所:Apache TomEEを配置した場所
    2. ユーザ名/パスワード:デフォルトならtomee/tomee。設定はconf/tomcat-users.xmlを直接編集する。


これで終わりです。Tomcatと同じ方法でインストールできます。

Java EE 6 サンプルアプリを動かす

NetBeansに収録されている Java EE 6 (JSF & JPA)のサンプルアプリである Pet Catalog を TomEE で実行してみます。

プロジェクトを作って何も考えずに実行する
  • 新規プロジェクトでサンプル > Java EE > Pet Catalog からプロジェクトを作る。
  • プロジェクトを選んで右クリック > プロパティ > 実行 > サーバ に先ほど登録した TomEE を選択 > OK
  • 実行
12 05, 2012 6:32:51 午前 org.apache.catalina.core.StandardWrapperValve invoke
重大: Servlet.service() for servlet [Faces Servlet] in context with path [/petcatalog] threw exception [javax.el.ELException: Error reading 'pagingInfo' on type controller.Catalog] with root cause
java.net.ConnectException: Connection refused: connect
	at java.net.DualStackPlainSocketImpl.connect0(Native Method)
(略)
<openjpa-2.2.0-r422266:1244990 fatal general error> org.apache.openjpa.persistence.PersistenceException: java.net.ConnectException: Connection refused: connect
(略)

そうは問屋が卸さない。しかし今回はとみー君が原因ではなく、JPA周りの設定していなかったのが原因であり、ここの設定を進めれば動きそうです。

TomEE の JPA 関係の設定をする

まずはpetcatalogの永続化ユニットの設定を確認します。

  • PetCatalog > 構成ファイル > persistence.xml (実体はsrc/conf/persistence.xml)
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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_2_0.xsd">
    <persistence-unit name="catalogPU" transaction-type="JTA">
        <jta-data-source>jdbc/petcatalog</jta-data-source>
        <properties>
            <property name="eclipselink.jdbc.user" value="root" />
            <property name="eclipselink.jdbc.password" value="nbuser" />
        </properties>
    </persistence-unit>
</persistence>

今回はとみー君に含まれるOpenJPAを使っているのでeclipselinkの設定を消します。

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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_2_0.xsd">
    <persistence-unit name="catalogPU" transaction-type="JTA">
        <jta-data-source>jdbc/petcatalog</jta-data-source>
    </persistence-unit>
</persistence>

次にとみー君のDataSourceは conf/tomee.xml で設定しています(参考)。これを開くと、以下のようなHSQLDBを使う設定がありました。

<Resource id="My DataSource" type="DataSource">
  JdbcDriver org.hsqldb.jdbcDriver
  JdbcUrl jdbc:hsqldb:file:data/hsqldb/hsqldb
  UserName sa
  Password
  JtaManaged true
</Resource>

<Resource id="My Unmanaged DataSource" type="DataSource">
  JdbcDriver org.hsqldb.jdbcDriver
  JdbcUrl jdbc:hsqldb:file:data/hsqldb/hsqldb
  UserName sa
  Password
  JtaManaged false
</Resource>

OSSのPostgreSQLの設定などに変更しても良いのですが、折角なのでHSQLDBを使います。他のデータベースを使う場合はこちらを参考に書き換えます
今回はJTAで管理しているデータソースとして jdbc/petcatalog をしているので、JtaManaged が true になっている Resource の id を合わせて変更します。

<Resource id="jdbc/petcatalog" type="DataSource">
  JdbcDriver org.hsqldb.jdbcDriver
  JdbcUrl jdbc:hsqldb:file:(適当なファイルのパス)
  UserName sa
  Password
  JtaManaged true
</Resource>

今回使うデータベースにテーブルを作る必要があります。各データベースに合わせて、PetCatalog > サーバー・リソースにある catalog.sql に書かれている SQL を実行してテーブルを作成します。今回はHSQLDBを使っているので、「java -cp lib/hsqldb-2.2.8.jar org.hsqldb.util.DatabaseManager」から HSQLDB の管理ツールを呼び出してテーブルを作成しました。

改めて実行する

サービスタブからTomEEを選択して右クリック→再起動を実施後、PetCatalogをもう一度実行してみます。

動きました!

まとめ

実際にここまでの作業をしていてストレスは余り感じないほど起動・再起動が高速でした。Tomcatに慣れているが、他のJavaEEサーバはちょっと…という人には良いかもしれません。しかし、管理コンソール/ツールが貧弱、IDEとの連携があまりなく他のJava EEサーバと比べるとIDEの恩恵が弱いという点が気になりました。普段はGlassFishを使っているのでその部分がより顕著に感じました。
余談ですが、JavaOne 2012のTomEEセッションで、「実際に商用で使えるのか?」という質問にはげふんげふんな感触でした。商用でも安定していくようであれば、戦略的に選択していく所も増えるのではないかと思います。がんばれとみー君!
同じオープンソースであるGlassFishの勉強会(#glassfishjp)が12/13(木)にあります!こちらもよろしくお願いします!

次回は @masafumi_ohta さんです!よろしくお願いします!