[Books] プログラミング関連書籍のご紹介―Java EE 編 (ja)

先に投稿したJava SE関連書籍に続いて、Java EE関連の書籍をご紹介します。

1. Struts
とりあえず国内ではStrutsの勢力がなかなか衰えないので、Struts関連書籍をご紹介します。
「Struts・イン・アクション」は、Strutsの開発メンバーがすべてを解説した伝説的な名著です。出版されたのが約10年前で、当時のStruts 1.1/1.0について書かれたものですが、ほとんどの内容が(多少の読み替えは必要だとしても)最新版のStruts 1.3系列にも適用できます。それだけStrutsが当初から高い完成度を誇っていた証拠でもあり、またStrutsがこの10年間ほとんど進化しなかった証拠でもあります。
基本的な構成はStruts 1.0の解説で、ところどころにStruts 1.1ではこのように変わるといったトピックが挟まってきます。序盤はMVCモデルに関する解説があり、Strutsが何であって何でないのか(Strutsには何が足りていないのか)、Strutsとスレッドの関係はどうなっているのか、など最新のStruts関連書籍でさえ触れられていないディープな話題が盛りだくさんで、気が付くころにはもうStrutsの最初のサンプルプログラムが始まっています。読み進めるうちにStrutsの深部に近づいてゆき、やがては外側から知り得るほとんどの情報を手にすることになります。そこから先はStrutsのソースコードを当たるべきで、そこまで到達していればもうソースコードを直接追いかけるだけの予備知識は出来上がっています。
Struts関連ではもう1冊、同時期に「プログラミングJakarta Struts」が登場していて、こちらの評判も良かったようです。ただし、筆者は「プログラミングJakarta Struts」を持っていたもののあまり相性が良くなく、結局はすべて「Struts・イン・アクション」に頼っていました。
この2冊がStruts解説本としては双璧に近く、それ以外は最新刊に至るまでこれらの内容の濃さに追いつかない状態が続いているように見受けられます。

2. Java EE 概説
Java EE全体を解説した書籍としては、Java EE 5の時に登場した「マスタリングJavaEE5」が秀逸です。Java EE 6になっても後述の「Beginning Java EE 6」が登場するまで、この書籍が果たした役割は大きいと思います。
「マスタリングJavaEE5」は著者の斉藤賢哉さんがサンフランシスコのJavaOneで発表されたJava EE 5に魅了され、その素晴らしさを日本に伝えたいという思いからプライベートの時間をほぼ費やして執筆したという力作で、EJB 3.0とJPA 1.0に力点を置きつつも、JSF(JSPとELを含む)、JMS、DIとエンタープライズ分野でよく使われている技術を一通り網羅しています。著者の斉藤さんは特にJPAに力を入れたとのことですが、他の仕様の解説についても手抜かりはなく、章立ての巧さも加わり、学習書としてもリファレンスとしても使える、とても有益な1冊となっています。また、次にご紹介する「Beginning Java EE 6」の翻訳作業が大幅に遅れたこともあり、Java EE 6登場後も本書をベースに、ネットやセミナー・勉強会でのJava EE 6セッション資料で内容を補完するという学習方法が長い間行われました(この方法は現在でもまだ有効だと考えます)。
Java EE 6については、今年3月に日本語書籍としては初めての解説本「Beginning Java EE 6」が発売されました。本書は米国で実績のある原著を日本の翻訳会社が邦訳し、それを日本オラクルのGlassFish部隊とWebLogic部隊が共同で監訳を行うという、文字通りの総力戦で作られた1冊です。それだけに充実した内容に仕上がっていますし、日本オラクルが総力を挙げてレビューしただけあり内容も正確です(原著が著者とアドバイザーの計2名で書かれているのに、なぜ日本オラクルが膨大なリソースを割かざるを得なかったのか不審な点もありますが...)。
本書は最初にJava EE 6とリファリンス実装のGlassFishに触れた後、書店の書籍管理システム構築を最終目標にして、各実装工程で必要な技術を順に解説していく方式を採っています。そのため最初にJPAの解説があり(この段階でデータベース周りが確定する)、次にEJBでビジネスロジックの実装方法を学び、そしてJSFを使った画面表示を検討してシステムを完成させるという流れになります。ちょうど1冊をやり終えると1つのサンプルシステムとJava EE 6の一通りの知識が手に入るというお得な構成です。
さて、本書を発売直後に入手した方々からCDIの解説が一切ないという指摘がありましたが、これについては翻訳対象とした原著の版ではCDIのトピックを取り込めておらず、それが直接的な原因だと聞いています。ただし、巻末に用意された日本語版独自の章である「ハンズオン」ではCDIを普通に使っているので、CDIの基礎についてはこの「ハンズオン」から学ぶことが出来ます。基本的な使い方はそこにある内容だけで十分ですし、応用的な使い方もWebで日本語の文献が多数見つけられますので、それを参考にするとよろしいかと思います。
最後に本書はリファレンス的な使い方を想定していないと著者が明言していますが、実際にはリファレンスとしてもある程度の使用に耐える構成にはなっています。ただし、網羅性や引きやすさの点では「マスタリングJavaEE5」に一歩劣るという印象を受けました。

3. Java EE 各論
Java EE個々の技術の解説書でまずご紹介したいのが「Enterprise JavaBeans 3.1 第6版」です。筆者は過去の版(EJB 2.1の頃)を全く理解できなかった過去を持っているのですが、第6版はほとんど全部書き直したと思われるほどまるで違う書籍に仕上がっています(主な著者も交代しています)。EJBの書籍と銘打っておきながら、実はJPAの解説もあり、それがかなり詳細にわたっています。これ1冊でEJBとJPAを同時に学ぶことが出来るのです。JPAは歴史的経緯から、EJB 3.0の一部として仕様策定がスタートしており、特にEJBと組み合わせることで分散トランザクション処理をほぼコーディングレスで実現できるというメリットがあります。それを実感するには本書のようにEJBとセットで学ぶのが一番だと思います。
EJB 3.1は単独でビジネスロジックの実装として使うだけでなく、JPAをはじめ、JSFのManaged Bean、JAX-WSのエンドポイント、JAX-RSのリソースクラスなどとしても使用することができ、そのパワーを局所的に使うことや、3層アーキテクチャを採らずに簡潔なアーキテクチャを実現するための鍵となります。実際に筆者はJava EE 6 のかんたん開発を示すサンプルとして、EJBの中にJAX-RSのリソースとJPAのEntityManagerを組み合わせて全体を1つのクラスで実現したことがあります。
EJB 3.1を使おうとする人、既に使っている人、いまだに敬遠している人、どのそうにもお薦めしたい1冊です。

次にJAX-RS関連の書籍を2冊ご紹介します。JAX-RSとは、穿った言い方をするならばJava版Railsです。もしRails以前にリリースされていたら、今頃Rubyは消滅していたとさえ言われるほど優れたAPIです。
まずご紹介するのは「RESTful Webサービス」です。最近流行しているREST方式のWebサービスについてその基礎から実装方法、細かな作法までみっちり特訓を受けるような印象を受ける1冊です。RESTの原典というとRoy Fieldingが2000年に発表した博士論文とされていますが、当論文はRESTの実装については全くと言っていいほど触れられておらず、原典と言うにはあまりに抽象的で理解しづらいものです。それを考えると、実質的なRESTの原典といえるのは本書ではないでしょうか。
もう1冊の「Webを支える技術」は、「RESTful Webサービス」を翻訳された山本陽平さんが自ら書き下ろしたものです。山本さんは日本におけるRESTの第一人者として知られており、訳書では伝えられなかった自らの想いをすべてぶつけた形になっています。コンパクトである上に必要な解説はきちんとなされているので、最初の1冊としてはこちらを選ぶのも有力な手でしょう。

REST関係ではさらに1冊ご紹介したい書籍があります。この「JavaによるRESTfulシステム構築」は、先の2冊と異なり、具体的にJavaでRESTを実現することを前提としています。さらに言うと、JBossのJAX-RS実装であるRESTEasyを使ったRESTful Webサービスの構築手法について解説しています。とは言うものの、多くはJAX-RSの仕様に収まっているため、GlassFishのJAX-RS実装Jerseyでもほぼ共通の手法が使えます。
この書籍の特徴として、後半にたくさんの演習問題を用意していることが挙げられます。この演習問題は基本的にRESTEasyを前提に作成されており、RESTEasyの拡張機能を利用しているケースはもちろんのこと、それ以外についてもRESTEasyでしか動かないといったことがありえます。GlassFishユーザーに取ってはなかなか扱いづらい書籍ではありますが、RESTEasy自体は優れた実装型であり、非同期REST通信など一部JAX-RS 2.0を先取りしているような機能も持っています。JBossユーザーには1冊丸々、それ以外のユーザーには前半の講義部分をお薦めします。
(筆者は自他共に認めるGlassFishの愛好家なので、この書籍ではかなり悔しい思いをしているのです)

SOAP関連は、個人的にあまり興味がなかったこともあり、ご紹介できるのはこの「Webサービス エッセンシャルズ」だけとなります。本書は一冊丸々SOAPと周辺技術の話題でしめられているのですが、Java EEでplumbing対象になっているJAX-RPCが現役自体の頃に書かれたものなので、実務に役立てるにはJAX-RPCのAPIをJAX-WSの相当する機能に置き換える必要が出てきます(とは言うものの、実際にはJAX-RPCのサポートを早々に切ってくるのはGlassFishくらいでしょうから、それ以外の環境では言われるほど影響は出ないのかも知れません)。ちなみに、本書で登場するApache SOAPというライブラリも、現在はApache Axis2(もしくはApache CXF)への移行が強く推奨されています。
購入時に中身を斜め読みした限りでは、解説が充実していそうで好感触を受けました。現時点で役に立つトピックと言えば、SOAPの仕様に関する部分、具体的にはエンベロープがどうなっていて、データ部がどこで...といったところに限られてくるかも知れません。

3. レガシーAPI
かんたん開発を標榜したJava EE 6ではさすがに直接使うことはなくなってきたAPIでも、より深いところまで踏み込んで理解しようとすると知らなければならないケースも出てきます。ServletとJDBCはその代表と言えます。
「Javaサーブレットプログラミング 第2版」はServlet 2.2とJSP 1.1の解説書の決定版と言えます。他のServlet/JSPでは分かりづらいパス周りの規則など、具体例を用いてわかりやすく解説しています。非常に分厚い1冊なので見かけに圧倒されがちですが、解説はわかりやすいと思います。この種の書籍に恒例の、当該技術が生まれた背景の話など、貴重なトピックも盛りだくさんです。もちろんリファレンスとしても強力ですが、Servlet 2.5以降(特にServlet 3.0)の変革にはさすがについてこれないというのが正直なところです。
「JDBCによるJavaデータベースプログラミング 第2版」は、1冊丸ごとJDBCの解説書です。APIの解説書と思いきや、実はこのデータベースのJDBCドライバにはバグがあり、必ずResultSetをクローズしないとリソースリークが発生する(他では発生しない)、と言ったような生々しい情報も書かれていたりします。JDBC自体、よく使う機能は限られていて、その使い方もワンパターンなので、本書の多くの部分はJDBCのリファレンスとなっています。Javadocの説明よりはわかりやすいのは当然なのですが、如何せんバージョンが古いため内容の陳腐化が懸念されます。例えばJDBC 4.0以降で導入された、java.sql.SQLExceptionの原因ごとのサブクラスなどには当然触れられていません。

4. その他
告白すると、TomcatはCatalina(サーブレットコンテナ)とJasper(JSPレンダリングエンジン)以外はゴミだと思っているのですが、ほとんどのアプリケーションサーバーは何らかの形でCatalinaとJasperを取り込んでいるので(例えばGlassFishはTomcat 5.5のCatalinaとJasperをベースにJava EE 5/6対応の改修を行っています)、結局Tomcatの知識はあった方が良いと言うことになります。幸いなことにTomcatには「Tomcatハンドブック 第2版」という比較的新しい実装の日本語版解説書があるので、情報を得るのに苦労はしません。
本書は網羅性の高い書籍であり、リファレンスとして使用すると高い効果が得られます。解説は他の書籍には載っていないような詳細まで言及しているので、欲している情報は大抵得られることでしょう。特にパフォーマンスについては細かな計測と考察がなされており、それぞれの場合に適したコネクター実装を選択しないとひどく応答性能が劣化することが示唆されています。
本書はTomcatのすべてを語ったものではありますが、Tomcat自体は機能の差し替えが激しいサーバーであり、特に実験段階や不安定な実装は、次のバージョンであっさり削除されることがあります。たとえ安定した実装であっても何の前触れもなく削除される場合があり得るので、本書があるから安心と思わず、常日頃から開発の動向をチェックしておく必要があります。ひょっとすると、あなたがこの記事を読んでいる最中にも、Tomcat開発コアメンバーの間で仕様変更が決定されているかも知れません。