Archive for the 'GlassFish' Category

glassfish_railsは動くのに、jetty_railsが上手く動かない

Rails 2.2でスレッド・セーフになると、JRuby上で動かす利点がさらに増えるよねってことで、JRuby On Railsを試したりしてる。

GlassFish Gemを使って、GlassFish v3にdeployするのは超簡単。
JRubyをinstallして、パスとか通したりしたら、
jruby -S gem install rails
で、JRuby用のRailsをinstall。ちなみにRubyGemsは最初から入ってる。
jruby -S rails demo
で、Railsアプリの雛形作成。
jruby -S gem install glassfish
で、GlassFish Gemのinstall。
jruby -S glassfish_rails demo
で、GlassFishを起動できる。んだけど、注意点が一つ。
WEBRickなりMongrelなりを起動するときは、作成したRailsアプリのディレクトリ(この場合demo)の中で、
ruby script/server
ってやってたけど、glassfish_railsコマンドはdemoの一個上のディレクトリで実行する。
そうすれば、http://localhost:3000/で、例のRailsのスタートページ(動作環境とかがAjaxで見えるやつ)が見える。
demoの中で実行した場合は、Railsアプリはdeployされず、GlassFishの動作確認ページっぽいのしかでてこない。

んで、その辺の情報を調査してるときに、rackに基づいて作られてるアプリをJavaのアプリケーションサーバ上で動かせるJRuby-Rackを発見。
これならRailsだけじゃなくてMerbで作ったアプリケーションなんかもGlassFishとかで動かせちゃう。

さらに、そのJRuby-Rackを使ってJetty上でRailsや、MerbなどのRackベースのframeworkで作られたアプリケーションを動かせるようにする、jetty-railsを発見。
こいつは、RailsやMerb以外にも、GlassFish GemではできないJava Servletアプリケーションも動かせるらしい。
GlassFish Gemの手軽さで、RailsとServletの共存ができるなんて素晴しいってことで、さっそく試してみた。

jruby -S gem install jetty-rails
で、install。
GlassFish Gemとは違って、Railsアプリのディレクトリ(今回はdemo)に入って、
jruby -S jetty_rails
で、上手くいくはずなのに、次のようなエラーが。

C:/jruby/jruby-1.1.4/lib/ruby/gems/1.8/gems/activesupport-2.1.2/lib/active_support/dependencies.rb:513:in `new_constants_in': protected method `log' called for ActiveSupport::Dependencies:Module (NoMethodError)
from C:/jruby/jruby-1.1.4/lib/ruby/gems/1.8/gems/activesupport-2.1.2/lib/active_support/dependencies.rb:510:in `require'
from C:/jruby/jruby-1.1.4/lib/ruby/gems/1.8/gems/jetty-rails-0.6/lib/jetty_rails.rb:13
from C:/jruby/jruby-1.1.4/lib/ruby/gems/1.8/gems/jetty-rails-0.6/lib/jetty_rails.rb:27:in `require'
from C:/jruby/jruby-1.1.4/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'
from C:/jruby/jruby-1.1.4/lib/ruby/gems/1.8/gems/jetty-rails-0.6/bin/jetty_rails:36
from C:/jruby/jruby-1.1.4/lib/ruby/gems/1.8/gems/jetty-rails-0.6/bin/jetty_rails:19:in `load'
from C:/jruby/jruby-1.1.4/bin/jetty_rails:19

config/jetty_rails.ymlを

---
:servers:
- :context_path: /demo
  :adapter: :rails
  :base: jetty_rails_proj
  :environment: development
  :port: 3000
:environment: production
:jruby_min_runtimes: 1
:jruby_max_runtimes: 2
:thread_pool_max: 40
:thread_pool_min: 1
:acceptor_size: 20

こんな感じで作って、config/environment.rbに
ActionController::AbstractRequest.relative_url_root = "/demo"
を追加しても同じ。

むーん。

===追記(10/30)===
どうやらJRuby1.1.4のバグのようです。
http://blogs.sun.com/cinnabar/entry/jetty_rails_with_jruby1_1

===追記(11/7)===
http://blogs.sun.com/cinnabar/entry/jruby1_1_5_releaseにある通り、JRuby1.1.5で動作するのを確認しました。

wicket-contrib-javaee

前回のエントリでご紹介したWicketとJavaEEを統合するためのライブラリ、wicket-contrib-javaeeを使ってみました。
このライブラリ、Wicket2.0からはwicket-springのようにWicketStuffから卒業しWicketプロジェクトに昇格するようです。

さて、環境としてはNetBeans 5.5およびEnterprise Pack 5.5にバンドルされてるSun Java System Application Server Platform Edition 9.0UR1を使い、データベースはPostgreSQL 8.2を使いました。

まず、wicket-contrib-javaeeでWicketとJavaEEを統合する際には、EntityManagerFactoryをDIする方法とセッションBeanをDIする方法があります。
EntityManagerFactoryをDIするには@PersistenceUnitを、セッションBeanをDIする際には@EJBを使います。

1.@PersistenceUnit
 この場合、NetBeansのプロジェクトとしてはWebアプリケーションプロジェクトを作成します。
 手順としては、DBテーブル作成→データベースからエンティティクラス自動生成→Web層の作成なのですが、ポイントがいくつかあります。

  • PostgreSQLのJDBCドライバをSun Java System Application Serverのlibディレクトリに入れる。
  • wicket-springのwicket-spring.jarが必要。
  • PostgreSQLを使う場合、Sun Java System Application Server Platform Edition 9.0UR1に同封されているTopLinkライブラリにはバグがあるので、GlassFishV2系のTopLinkライブラリをコピーして上書きする。
  • テーブル作成時に、PostgreSQLの場合主キーをSERIALにする。そうするとシーケンスが一つ作成されるので、そのシーケンス名(users_id_seqとする)を、自動生成されたエンティティクラスの@Idがついてるとこに、@GeneratedValue(strategy=GenerationType.SEQUENCE, generator=”users_id_seq”)を指定する。
  • 持続性ユニットの編集(persistence.xml)で、含めるエンティティークラスに自動生成されたクラスを加える。
  • Pageクラス内で、HeaderContributor.forCss()を使ってCSSを指定しても反映されることとされないことがある(原因不明)。

2.@EJB
 この場合、NetBeansのプロジェクトとしてはエンタープライズアプリケーションプロジェクトを作成します。
 ポイントは@PersistenceUnitのときとほぼ同じなのですが、作成するセッションBeanについて

  • Localじゃないとだめ?
  • Localインタフェースはインナークラスじゃだめ?

 という制約があるかもしれません。

あとは、HPのサイプルを見れば出来るでしょう。

一応、前回同様作成したNetBeansプロジェクトをDLできるようにしております。
WicketEJB.zip(4.22MB)
WicketEJB2.zip(4.18MB)

DLして展開し、NetBeansでプロジェクトとして開き、WicketEJBというライブラリを
 Wicket-1.2.4.jar
 wicket-extensions-1.2.4.jar
 wicket-contrib-javaee-1.0.jar
 wicket-spring-1.2.4.jar
 commons-logging-1.0.4.jar
 cglib-nodep-1.2_3.jar
を含めて作ればOKです。

前回同様Public Domainなのでご自由にどうぞ。

Webアプリ作成前に考えたこと

僕が今回、Webアプリを作ろうと思ったときに、考えたことをまとめてみます。

  1. 何を作るのか。
  2. どのように公開するのか。
  3. 動作OSは何にするのか。
  4. 作成言語は何にするのか。
  5. 使用フレームワーク・手法・ツールは何にするのか。

まず1番目。何を作るのか。

これが決まらないと、どうしようもないですよね。まあ、漠然となんでもいいから作りたいってこともあるかもしれませんが。
今回僕は、ある特定の分野に特化したSNS+Blogのようなシステムを作ろうと考えております。

次に、公開方法をどうするのか。

とりあえず、自宅サーバで運用していこうと思います。もし万一、自宅サーバじゃおっつかなくなったら、レンタルサーバとかに移行するかもしれませんが。

そして、動作OS。

自宅サーバでいく限り、Linuxが基本になります。ずっとCentOS使ってたけど、Solaris 10(とBelenix)のインストールにチャレンジして失敗して以来、またCentOSに戻してずるずる使ってました。

でも、最近人気のUbuntuが気になって、6.10が出たので入れてみたらこれが想像以上にいい!ってことで、Ubuntu Linuxでいこうと思っています。

それから、言語。

いろいろ悩みましたが、まずLinuxってことで.NETは却下(Mono使えばいいかもしれませんが)。Webアプリ作成に使える言語でなれているのはJavaかRubyであり、Ruby On Railsも使いたいけど今回は仕事のための技術習得もかねてJavaでいくことに決めました。

最後に使用フレームワーク等。

RubyならRailsで決定だったんですが、Javaの場合いろいろ多すぎて相当悩みました。とりあえず、Ajaxはふんだんに採り入れたい、最新の技術を使っていきたいってことで、以下のような候補をあげました。

とりあえず、Ajax層・プレゼン層・ビジネスロジック層・パーシステンス層・フルスタックなものに分けて書いてみましたが、これの組合せで色々考えました。

まず、プレゼン層。

今後の標準を考えればJSFなんだろうけど、あまりJSF好きじゃないんでその他を考えてたところ、Ajaxとの親和性からEcho 2が、作成面のやりやすさからWicketが候補としてあがりました。Echo 2はほんとに素晴らしいフレームワークで、こちらのDemoみてもわかるとおりAjaxに特化したフレームワークです。最初はEcho 2で行っちゃおうかと思ったんだけど、そのころWicketがApache Software Foundation入りするって話題が入って、Wicketも大好きなフレームワークだったから調べ直したら、こちらもAjaxとの親和性が相当高くなってきてることを再確認しました。両方とも試しにプログラム組んでみたりしたところ、Wicketの方がEcho 2よりもプログラマに残されている領域が広い(逆にいうとEcho 2はWicketよりフレームワーク主導な部分が多い)と感じ、Wicketで行くことに決めました。そして、AjaxはWicketに組込みのものを使っていこうと思います。

次にビジネスロジック層。

プレゼン層でJSFに決まっていれば、EJB 3.0かSeasar 2.4の一騎打ちだったのですが、WicketになったのでWicketとの親和性を考えてSpring 2.0に決めました。また、WicketにはDataBinderという素晴らしいフレームワークがあり、これを使えばHibernateとの連携がとても簡単にできるとのことだったのですが、DataBinderの開発が実質一人で行われていること、Maven 2主導でいろんなライブラリとか勝手に使われたりするとこが気に食わなくて、使うのは遠慮しときました。

んで、パーシステンス層。

Wicket+Springとくれば、ここはHibernateに迷いなく決めました。ほんとはdb4oとかのオブジェクトデータベースとかも使って見たかったんだけどね。

最後に、フルスタックのフレームワーク。

QwicketはWicket+Spring+Hibernateのフレームワーク。結果として僕が選んだのと同じ組合せなので、これを使おうかと思ったけど、更新滞ってていまだにWicket、Spring、Hibernateともに古いバージョンなので、これも却下しました。また、ROMAはEcho 2+Spring+JPOXのフレームワークであり、Echo 2でいくことになってたらこれもアリだったのかもしれませんが、Wicketを選んだのでこれも却下で。ChuraはSeasar 2.4使うならってとこだったんだけどこれも却下で。

というわけで、結果としてWicket1.2.3+Spring 2.0+Hibernate 3.2で自力で組み合わせて作っていくことにしました。

それを前提に、使用するサーバ・DB等を考えました。

EJB 3.0ならJBossGeronimoGlassfishかといったところだったのですが、Springでいくので今回はJetty 6.0.1でいくことにしました。Jettyを選んだ理由としては、Cometを実現しやすいことがあります。まあ、GlassfishでもNIO使ってるらしいけど。JettyのほうがWebサーバ機能もあり、軽量だってことで。

んで、DBはPostgresでいきます。MySQLでもいいんだけど、なんとなくエンタープライズ版だしたりするあたりの商魂が嫌だったんで。

最後にIDEはEclipse(+Callisto)でいきます。EJB 3.0ならNetBeansこのDemoみたいに楽にできるみたいだけど、EclipseのWTP用のJettyプラグインも発見したので、まあEclipseでいいかな、と。Wicket用のプラグインであるWicket Benchとかもあるけど、これもライブラリファイルとか勝手に入れてくれたりするので気にくわなかった。

というわけでまとめると、

OS:Ubuntu Linux 6.10 日本語版
言語:Java
フレームワーク:Wicket 1.2.3、Spring 2.0、Hibernate 3.2
アプリケーションサーバ:Jetty 6.0.1
データベース:PostgreSQL 8.1.4

で、SNS+Blogのようなシステムを作っていきます。

次回は、WicketとSpringとHibernateを結びつける方法について書こうと思います。

ではまた。

次のページ »