GlassFish

GlassFishは、サン・マイクロシステムズを中心としたオープンソース・コミュニティと、同コミュニティで開発されたJava EE準拠のアプリケーションサーバの名称である。その後、サンを買収したオラクルによってコミュニティが継続された。2017年、Java EEの策定がEclipse Foundationに移管されることになり、それに伴いGlassFishも同組織に寄贈された。

本項では以降、特別な断りのない限りアプリケーションサーバのことを指すものとし、コミュニティについてはGlassFishコミュニティと呼称する。

GlassFishは設計・開発・テストのすべてをオープンソース・コミュニティ上で行っている。かつては、オラクルによる商用サポートも同時に行われていたが、GlassFish 4.0を機に廃止され、開発者向けのJava EEの参照実装としての位置になっている。GlassFishはEclipse Public License Eclipse Foundationへの寄贈前はCommon Development and Distribution License  }}と、クラスパス例外を含むGNU General Public License  の二重ライセンスである。

1. 歴史
-----

1.1. GlassFish v1
-----------------

GlassFishは、Sun Java System Application Server 8.xの後継製品であり、サン最初のオープンソース・アプリケーションサーバとして開発が開始された。GlassFishプロジェクトは2005年6月6日に発足し、2006年5月4日に最初のバージョン  をリリースした。GlassFish v1の概要は下記の通りである。

Java EE 5準拠である。
オープンソースである。
他のグループから多数の優れたコンポーネントを採用している。例えばMetro  やJAXBなど。この中にはオラクルから提供を受けたTopLinkも含まれる。
年間330万ダウンロード以上を目標とする。
Sun Java System Application Server 9.0として、サンによる商用サポートを提供する。GlassFish v1は1回のアップデートリリースと5回のパッチリリースがリリースされた。

1.2. GlassFish v2
-----------------

GlassFish v1はJava EE 5の参照実装としての色合いが強く、単一インスタンスに特化していた。2つめのメジャーリリース  ではその点を大幅に改善したものとなった。GlassFish v2の新機能は以下の通りである。

クラスタリングおよびHADBの提供。JXTAベースのインメモリ・レプリケーション・メカニズムが含まれる。
商用レベルの管理・監視機能の提供。これには管理コンソール、ドキュメント、CLIの監視機能が含まれる。
オールインワン。SJS AS 8.xには複数のエディションがあったが、GlassFish v2ではそれらが統合された。
Metro Webサービスフレームワークとマイクロソフト製品  との相互接続性の保証。
パフォーマンスの向上。オープンソース・アプリケーションサーバで唯一SPECjAppServer 2004ベンチマークを実施し、BEA WebLogicとIBM WebSphereを凌ぐ結果を出した。GlassFish v2の最初のリリースは2007年9月17日に行われた。このバージョンのサンにおける名称はSun Java System Application Server 9.1である。 GlassFish v2は2011年1月時点で4回のアップデートリリースと21回のパッチリリースがリリースされており、今後もパッチリリースが予定されている。 なお、GlassFish v2.1において、サンにおける名称がSun GlassFish Enterprise Server 2.1に変更され、以降バージョン番号がコミュニティ版と商用版で統一された。

1.2.1. SailFin
--------------

サンとエリクソンによる「Communication Application Server」を構築するプロジェクトで、2007年5月8日にGlassFishのサブプロジェクト[1]としてJava Oneで発表された。SailFinは、エリクソンから提供されたSIP Servlet をGlassFish v2.1へ統合したものである。SailFin 1.0はGlassFish v2.1と同時の2009年1月26日にリリースされた。サンによる商用版はSun Java System Communication Application Serverである。

1.3. GlassFish v3
-----------------

その次のメジャーリリースとなるGlassFish v3は、Java EE 6の参照実装であると同時に、アーキテクチャを抜本的に見直し、OSGiモジュールサブシステムに対応した。機能を使われるときに初期化することで非常に高速な起動を実現し、また再起動の待ち時間を大幅に減少させることに成功している。この新しいアーキテクチャはGlassFish v3 Preludeとして先行してリリースされている。また、GlassFish v3ではJava EE以外のスクリプト言語にも本格的に対応しており、GlassFish上で動作するスクリプト言語実装も増加している。

1.3.1. GlassFish v3 Prelude
---------------------------

2008年11月6日にリリースされた最初のv3系がGlassFish v3 Preludeである。この製品はJava EE 5のサブセットを提供し、一部Java EE 6の機能を取り込んだものであった。Java EEには準拠していないが、サンによる商用サポートが提供されていた。

1.3.2. GlassFish v3
-------------------

2009年12月10日、GlassFish v3がリリースされた。これはJava EE 6に準拠した最初のアプリケーションサーバである。当初予定していたクラスタ機能がGlassFish v3.1へ先送りとなったが、サンによる商用サポートは引き続き提供された。GlassFish v3の主な機能は以下の通りである。

Java EE 6の参照実装の提供。
OSGiモジュール化サブシステムに対応
Metro Webサービスフレームワークとマイクロソフト製品  との相互接続性の保証。
非同期I/O  に対応
従来からの管理コンソール、CLIの管理ツールに加え、RESTful管理チャネルが追加された。これにより、JAX-RSアプリケーションからサーバの管理・監視ができるようになった。
インストーラ版に加え、ZIPアーカイブ版による配布が開始された。ZIPアーカイブ版はあらかじめデフォルトでサーバが構成された状態で配布されるため、アーカイブを展開してすぐに利用可能である。2010年1月27日にオラクルによるサンの買収が完了すると、GlassFishのサポートはオラクルに引き継がれた。2010年6月18日、GlassFishバージョン3.0.1がリリースされた。このリリースでは100のバグの修正と多言語化が実施されると同時に、ブランドがサンからオラクルに移行したのに伴い、オープンソース版がGlassFish Server Open Source Edition、オラクル製品版がOracle GlassFish Serverへと名称変更となった。またこのリリースからJRockitが正式サポートされるようになった。2010年10月8日には製品版のパッチリリースが行われた。

1.3.3. GlassFish v3.1
---------------------

GlassFish v3リリースで先送りされたクラスタなどの高可用性機能を実装したものがGlassFish v3.1である。このバージョンにより前メジャーバージョンで提供されていた機能が一通り揃うことになった。GlassFish v3.1は2011年2月28日にリリースされた。 GlassFish v3.1の主な機能は以下の通りである。

クラスタ対応。方式としてGlassFish v2に存在していたNode Agentを廃止し、新たにSSHプロビジョニングを採用する。SSHプロビジョニング方式では、クラスタノード側でSSHのサーバプロセスを起動しておくだけで、ドメイン管理サーバがシステムの初期化とドメイン管理サーバへの登録を行う。ノード側ではGlassFishをインストールする必要もなく、ドメイン管理サーバが自らのインスタンスをアーカイブしてノードに転送しリモートインストールを実行する。v3.1.2以降、Windowsプラットフォームに限りSSHの代替としてDCOMのRPCを使用することが可能となっている。
アプリケーションのバージョニング対応。サーバ上に同じアプリケーションの複数のバージョンを同時に配備しておき、その中から1つのバージョンを選んで稼働させることができる。配備できるアプリケーション数とバージョン数は事実上無制限である。
ドメイン管理サーバの高可用性
HTML5 WebSocket対応
管理・監視機能の強化。DTraceによるモニタリングが正式サポートされる。
WebLogicとの互換性の提供。2011年7月28日にはバージョン3.1.1がリリースされた。主な変更点はJDK7対応、AIXサポートの追加およびバグフィックスである。2012年2月にリリースされたバージョン3.1.2ではバグフィックスに加え、開発中止となったバージョン3.2の一部機能が追加されている。 バージョン3.1.x系列の最新版は2012年7月15日にリリースされた3.1.2.2である。

1.3.4. GlassFish 3.2
--------------------

GlassFish 3.1のアップデート版としてGlassFish 4と並行して開発が進められていた。GlassFish 4までの橋渡しとしていくつかの新機能を実装するプラットフォームとなる予定だったが、GlassFish 4に注力するため開発は中止された。実装予定の新機能の多くはGlassFish 4で実現されたが、既に完成していた機能についてはバージョン3.1.2にバックポートされる形で取り込まれた。

1.4. GlassFish 4.0
------------------

GlassFish 4.0は2013年6月11日にリリースされたメジャーバージョンであり、Java EE 7の参照実装でもある。GlassFish 3.xのアーキテクチャをベースとしている。開発段階ではPaaS型のクラウドへの対応を予定しており、従来の管理コンソールに加え、PaaS環境の管理・監視を行うためのPaaSコンソールを有していた。この機能はPaaS対応がJava EE 8へ延期となったことからリリースからは除外されている。このバージョンはJava EE 7の参照実装としての位置づけであり、Oracleによる商用サポート対象からは除外されているinfoq20131118}}。

1.4.1. GlassFish 4.1
--------------------

GlassFish 4.x系列のアップデートは、当初コミュニティ向けのGlassFish 4.0.1と商用サポートを含むGlassFish 4.1の二本立てで計画されていた。しかし、OracleによるGlassFish 4.x系列の商用サポート打ち切りが発表され、GlassFishの開発は継続されるものの再び開発者向けのJava EEの参照実装であると位置づけられることとなった。Oracleでは商用サポートが必要な場合は同社の別のアプリケーションサーバーであるOracle WebLogic Serverに移行するよう呼びかけている。 さらに当初のGlassFish 4.1はキャンセルされ、GlassFish 4.0.1のみ開発が継続された。 それに追い打ちをかけるようにGlassFish 4.0.1の開発は停滞し、当初予定していた2013年終わりにはリリースできなかった。その間にコンポーネント単位でのアップデートは急速に進み、最終的にはGlassFish 4.1とバージョンを変えて2014年9月9日にリリースされた。

1.4.2. GlassFish 4.1.1
----------------------

2015年9月24日にリリースされたGlassFish 4.x系列の2番目のアップデートであり、当初はGlassFish 4.2と呼称されていたが、開発の途中でGlassFish 4.1.1に変更された。主な変更点はコンポーネントのさらなるアップデートである。なお、GlassFishの開発Trunkは、このバージョンのリリースをもってGlassFish 5系列に移行している。

1.4.3. GlassFish 4.1.2
----------------------

2017年3月31日にリリースされた。

1.5. GlassFish 5.0
------------------

2017年9月21日にJava EE 8の参照実装としてリリースされた。

1.5.1. GlassFish 5.1
--------------------

2019年1月29日にリリースされた。Eclipse Foundation寄贈後の最初のリリース。

2. 技術
-----

2.1. モジュールサブシステム 
-------------------------------

GlassFish v3はGlassFish OSGiランタイムとGlassFish Kernel  の2つのモジュールサブシステムによりサーバ全体をモジュール化している。GlassFish OSGiランタイムはOSGi Release 4に準拠したランタイムを利用可能で、組み込みのランタイムとしてApache Felixが採用されている。

GlassFish KernelはHK2と略される、JSR-277ベースのモジュールサブシステムである当初、JSR-277はJava SE 7へ組まれる予定だったため、Java SE 7対応としてHK2を実装したものの、Java SE 7でJSR-277は不採用となった。}}。HK2はOSGiランタイムだけでは補えないモジュール管理機能を担当している。OSGi対応前はすべての機能をHK2のモジュールとして作成していたため、今でもGlassFishのモジュールの実装にはHK2のAPIが使用される。

GlassFish上では任意のOSGiバンドルを利用可能なため、例えばSpring DMとJava EEを連携させるような運用も可能である。

2.2. Nucleus
------------

GlassFish v3のカーネルと主要部分はNucleusと呼ばれている。構成は以下の通り。

Config Framework - 設定情報ファイル  とそれを管理するフレームワーク
CLI Framework - コマンドライン・インタフェース
Grizzly - リクエスト・ディスパッチャ
Monitoring Framework - 監視フレームワーク
Security Service - SSL等のサポート
REST Backend - REST管理チャネル

2.3. IPS
--------

IPS ) は、OpenSolarisプロジェクトで開発されたパッケージのインストール、アップグレード、削除などのソフトウェアのライフサイクル管理のために提供されるフレームワークである。 IPSはOpenMQをGlassFish 2.1.1に統合する際にGlassFish v2に追加され、GlassFish v3以降は標準の更新ツールとして採用されている。GlassFish v3のオープンソース版と商用版のライセンス切り替えに伴う実装の変更は、IPSのコマンドにより比較的容易に実施できる。

2.4. Grizzly
------------

GlassFishで採用されているハイパフォーマンスなリクエストディスパッチャがGrizzlyである。GrizzlyはGlassFishのHTTPサーバ実装プロジェクトとして2004年から開発が始められ、現在ではマルチプロトコル対応のネットワークサーバエンジンとなっている。Grizzlyは当初、サンのアプリケーションサーバで使用していたApache TomcatのCoyoteエンジンではGlassFishの要求性能を満たせなかったことから、Java NIOを用いて試験的に実装されたものであった。その後、TCP/UDP/SSLなどのマルチプロトコルに対応できる汎用性が注目され、GlassFish v2.1向け実装  からアーキテクチャを大幅に変更し、SailFinのSIPにも容易に対応している。

GrizzlyはJava NIOによる非ブロッキングI/Oを活用することで、1リクエスト当たりのスレッド生成数を抑えることに成功しているGrizzlyの開発者の1人であるJean-Francoisによると、Grizzlyはわずか30スレッドで10,000接続を処理することができるとしている。}}。GlassFish v3ではOSGiバンドルとして再実装されたGrizzly 1.9.18以降、v4ではさらに性能が向上したGrizzly 2.3.3以降が採用されている。

GlassFishでは、サーブレットコンテナとしてもGrizzlyが用いられているが、一部の処理にはTomcat 5.5に由来するコードが使用されている大幅な改修が加えられているものの、コピーライトやクラス構成にその名残がある。なお、JSPエンジンはTomcatのJasperを拡張したものである。}}。

2.5. CLI Framework
------------------

2.6. Monitoring Framework
-------------------------

2.7. REST Backend
-----------------

2.8. 高可用性
---------

3. Java EE参照実装
--------------

Java EE参照実装は、サブプロジェクトであるMetro 、Jersey 、Mojarra 、OpenMQ 、Tyrus 、JSON Processing でそれぞれ開発されている。また、Weld 、Hibernate Validator 、EclipseLink 、JBatchなど外部の有力な参照実装を採用している。

3.1. Metro
----------

JAX-WSの参照実装であり、Apache Axis2より90%高速である。SOAP通信において、Microsoft .NET Framework 3.0および3.5との相互接続性が保証されている。

3.2. Jersey
-----------

JAX-RSの参照実装である。 GlassFish v3ではREST Backendの基盤でありNucleusに含まれている。そのため他のJava EEサーバと異なり、GlassFish v3ではJAX-RS実装であるJerseyをサーバ本体から切り離すことができない。

3.3. Mojarra
------------

3.4. OpenMQ
-----------

3.5. Tyrus
----------

3.6. JSON Processing
--------------------

4. 多国語版
-------

GlassFish v2より英語の他、日本語、簡体字中国語、繁体字中国語、ハングル、スペイン語、フランス語、ドイツ語を含む多国語版リリースが行われているGlassFish v3のリリース当初は他言語版の配布がなく更新ツールによる対応であった。}}。GlassFish 4.1以降、再び他言語版の配布がなくなり更新ツールによる対応に戻された。

5. サードパーティーによる商用サポート
--------------------

GlassFish自体はOracleによる商用サポートを外されたが、いくつかのベンダーやコンサルティングファームによるサードパーティー・サポートが継続されている。中でも初期からサポートを行っているC2B2社のPayaraは、GlassFishおよび同社によるGlassFishの派生版であるPayaraの双方のサポートを提供しているyoshio3/from-glassfish-2-payara}}。

6. 脚注
-----

6.1. 注釈
-------

6.2. 出典
-------

7. 関連項目
-------

Jakarta EE
OpenMQ
Apache Tomcat

8. 外部リンク
--------