JakartaEE9リリース記念でGlassfish6に触れる

# はじめに
Javaの仕様にはJavaSEとJavaEEがありましたが、JavaEEはOracle主導から手を離れ、Eclipse Foundationに寄贈されました。それを機にJavaEEと仕様を名乗ることができなくなり、Jakarta EEという仕様名称になりました。
（紆余曲折ありましたが、かなり端折って結論だけでいうと、こんな感じと捉えてます）

- Jakarta EEのサイト
    - https://jakarta.ee/

## JakartaEEのバージョンと最新版について
Jakarta EE となってからは、JavaEE8のほぼミラーとなったJakarta EE8と、この12月にリリースされたJakarta EE9があります。

- Jakarta EE9のリリースページ   
    - https://jakarta.ee/release/9/

Jakarta EE9のページでは３つの特徴があると表現されています。

- lower entry barriers
    - これは、過去JavaEEの仕様を満たすアプリケーションサーバー（WebLogicとかJBossとか）がいくつかあるものの固定ベンダー、固定製品になっていることに課題意識を持ったものです。過去JavaEEの仕様を確かめるTCKと呼ばれるテストケース・ツールは非公開でした。Jakarta EEになったことで、このTCKも公開することで新しくアプリケーションサーバとなる障壁を低くしたというコンセプトになります。

- foundation for innovation
    - 影響が大きいところをあえてこんな表現にしているものなのですが、OracleからEclipse Foundationに移管されましたが、javaxのパッケージ内のものについて改変・追加は許しませんでした。
    - それを受けて、javaxを捨てて、jakartaというパッケージ名にすることになりました
    - 既存はそのまま追加修正分だけ変えるか、という議論もありましたが利用者目線で使い分けは望ましくないと既存のものも含めてjakartaに寄せることになりました。
    - その次に、寄せる方法として段階を踏んでjakartaに寄せるか、一気に寄せるかという議論があり、これも混乱を避けるために一気に寄せるという結論となりました。
    - ということでこのバージョンでjavaxからjakartaというパッケージ名に寄せることになったという意図でこのコンセプトを打ち出しています（Big Bangリリースと呼ばれています）

- easy migration
    - 先に述べた通り、jakartaee 9に移行することはjakartaというパッケージ名を使わないといけないので大変です
    - それに際して、簡単に移行できるようにというコンセプトもあります
    - 具体的には上記パッケージ名変換のためのツールが用意されるという仕様です
        - これには一つ鬼門があって、コンパイル時に変換されるツールなのか、デプロイ時に変換されるツールなのかはアプリケーションサーバーによって、まちまちになる可能性があります。既存のソースコードやOSSなどを流用してJakarta EE9ベースのアプリケーションサーバーに乗せるときには、OSSなどライブラリを含む場合はデプロイ時変換されないと、結構クリティカルですね

## Jakarta EE9に対応したアプリケーションサーバーについて
Jakarta EEのホームページに対応アプリケーションサーバが記載されてますが、今のところGlassFishだけです。

- 対応アプリケーションサーバーが記載されているページ
    - https://jakarta.ee/compatibility/#tab-9

そしてGlassFishのページ（ https://github.com/eclipse-ee4j/glassfish/releases ）に行ってみると、現時点(2020/12/20)では、6.0.0-RC3までしかダウンロードできません。
そうです、Jakarta EE9がリリース（仕様公開）されたにも関わらず、対応したGlassFishは正式版としてリリースされていないのです。JavaEEの頃は、このようなことはなかったですね。Glassfishの開発速度が遅くなったのではなく、仕様のリリース速度が速くなった（同時リリースに拘らなくなった）と理解しましょう。。。

このGlassFish 6.0.0-RC3をダウンロードしてunzipすると普通のGlassFishというアプリケーションサーバーとして使えます。

```bash
\$ java -version
openjdk version "1.8.0_275"
OpenJDK Runtime Environment Corretto-8.275.01.1 (build 1.8.0_275-b01)
OpenJDK 64-Bit Server VM Corretto-8.275.01.1 (build 25.275-b01, mixed mode)

\$ tree . | head -30
.
├── META-INF
│   ├── LICENSE.md
│   └── NOTICE.md
├── README.txt
├── bin
│   ├── asadmin
│   ├── asadmin.bat
│   ├── debug-asadmin
│   └── debug-asadmin.bat
├── glassfish
│   ├── bin
│   │   ├── appclient
│   │   ├── appclient.bat
│   │   ├── appclient.js
│   │   ├── asadmin
│   │   ├── asadmin.bat
│   │   ├── capture-schema
│   │   ├── capture-schema.1m
│   │   ├── capture-schema.bat
│   │   ├── jspc
│   │   ├── jspc.bat
│   │   ├── package-appclient
│   │   ├── package-appclient.bat
│   │   ├── schemagen
│   │   ├── schemagen.bat
│   │   ├── startserv
│   │   ├── startserv.bat
│   │   ├── stopserv
│   │   ├── stopserv.bat

// 起動させるときは

sh bin/asadmin start-domain

```

このバージョンではJava8でないと動かないことに注意です。
JakartaEE 9では初回バージョンではJava11への対応に間に合いませんでした。。よって、JakartaEE 9はJava8で動かす必要があります。Jakarta EE9.1というマイナーバージョンアップでJava11に対応する予定です。

- JakartaEE 9.1に対する予定案
    - https://www.agilejava.eu/2020/12/18/planning-for-jakarta-ee-9-1/

### アプリケーションのソースコードからみる違いについて
JakartaEE9をmavenのpom.xmlに以下のように設定します

```xml
        <dependency>
            <groupId>jakarta.platform</groupId>
            <artifactId>jakarta.jakartaee-api</artifactId>
            <version>9.0.0</version>
            <scope>provided</scope>
        </dependency>
```
このように設定することでJakarta EE9ベースで開発することができます。
先ほど説明したとおり、JakartaEE9ではjavaxからjakartaパッケージへのBig Bangリリースが入ってますので、javaxが使えません。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/ea506f5c-c04d-9014-61a6-bcd4ea19a2f2.png)

よって、javaxをjakartaeeに変更することでコンパイルが通ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/b01a39bd-44b8-3e0b-45ff-bf1538d2b921.png)

これでコンパイルが通ったので、Glassfishにデプロイすることで無事動作確認することができます。

ちなみに、pom.xml上でバージョンを8.0.0にし、パッケージ名をjavaxのままにしてコンパイル、ビルドし、Glassfish6.0.0RC3にデプロイするとどうなるでしょうか？
デプロイ自体はエラーとならないのですが、javax系のアノテーションは無視されるという動きになりました。
若干中途半端な動きですが、、柔軟性を持たせたということなのでしょうか。。
Glassfish6.0については、こちらの動画( https://www.youtube.com/watch?v=aSIQ6ONKJWs )に詳細説明されているので見てみてください。

# おわりに
Glassfish6.0.0の正式版がこのあたりには出ているだろうと思ってましたが、まさかのまだ出ていない状況でした。。
既に欧米はクリスマス休暇に入ったでしょうから、年明けでしょうか。
それを楽しみにしておきたいと思います。

- 使ったソースコード
    - https://github.com/omix222/jee9demo