Archive for the 'Jetty' 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とSpringとJPAを使ったAjaxなCRUDサンプルのソースとか

を、公開します。

ソースとかっていうか、EclipseのプロジェクトをそのままZipしただけなんで、
展開すればそのままEclipseにImportできます。
ただし、WTP使ってるんで、WTPプラグインは入れてるEclipseがいいでしょう。
APサーバは、僕はJettyを使いましたが、別に他のAPサーバでも大丈夫(なはず)です。
Jettyを使う方はWTPのJettyプラグインを入れ、それ以外のAPサーバを使う方は各自ご自由に設定ください。

また、現状では、PostgreSQL8.xを使うようになってます。
おそらく他のRDBでも大丈夫ですが、その場合は適宜JDBCドライバライブラリを入れてください。
misc/sql/createTable.sqlを流してもらうと、今回使うテーブルを作成します。

ソースの解説とかは、JavaDoc見れば分かるレベルだと思うので特にするつもりもないです。
不明点とかあれば、コメントくださいませ。

あー、あと配布物の中の僕自身のオリジナルのコード等はPublic Domainってことにします。
つまり、著作権は主張しませんのでお好きいじって使ってください。

ダウンロードはこちらから(9.0Mぐらい)。

#ってか、下で公開してたサンプルに、「ひがやすお」というエントリがあったんだけど、
#ご本人なのだろうか・・・。

WicketとSpringとJPAを使ったAjaxなCRUDサンプル

うーん、前回から思った以上に時間が開いてしまいました。

とりあえず普通にCRUDするだけのサンプルにしようと思ったのですが、
それだけだと面白みに欠けるので、WicketにビルトインされてるAjaxを使ったものも
一緒に作ってみました。

プレゼン層:Wicket 1.2.3
DIコンテナ:Spring 2.0.1
JPA:Hibernate 3.2.1
DB:Postgres 8.1.4
APサーバ:Jetty 6.0.1
OS:Ubuntu Linux 6.10
という構成です。

サンプルは自宅サーバにて公開してます。
http://server.mesolabs.com/WicketSpring/

このサンプルのソースとEclipseプロジェクトも近日中に公開いたします。

それでは今回は時間ないのでこのへんで。

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を結びつける方法について書こうと思います。

ではまた。

次のページ »