Java 11+でCORBAサービスを呼び出してみる

以前「[Spring(Java)からCORBAサービスを呼び出してみる](https://qiita.com/kazuki43zoo/items/5eb4d57d785e0b3505fb)」にて、Java 8上でSpringの機能を使ってCORBAサービスを呼び出す方法を紹介してみましたが、今回はJava 11+にて、代替ライブラリを利用してCORBAサービスを呼び出す方法について紹介してみようかと思います（なぜこの時代にCORBAなのか！？については・・・聞かないでくださいw）。

# 検証バージョン

### JDK
* AdoptOpenJDK 11.0.4+11
* OpenJDK 12.0.2+10
* OpenJDK 13+33
* OpenJDK 14-ea+14-570
* JDK 8 (orbdを使ってネーミングサービス経由でのアクセスをできるようにするため)

> **NOTE:**
>
> 本エントリではCORBAサービスもJavaで作成しているのですが・・・CORBAオブジェクトをネーミングサービス経由で取得できるようにするためにはJDK 8に含まれていたorbd相当の機能も必要になります（ネーミングサービスを使わずにIOR文字列を使ってCORBAオブジェクトを取得する場合はorbd相当の機能は不要です）。JDK 11以降にorbdコマンドは含まれていないので・・・本エントリーではorbdコマンドを使うためだけにJDK 8を使います・・・（完全に妥協ですが、本エントリーはあくまでクライアント側にフォーカスを当てているのでご了承ください）

### Spring Boot
* Spring Boot 2.1.8.RELEASE

### 代替ライブラリ

* [Eclipse ORB](https://projects.eclipse.org/projects/ee4j.orb) 4.2.1
* [JBoss repackaging of the OpenJDK ORB](https://github.com/jboss/openjdk-orb) 8.1.4.Final
* [JBoss repackaging of the OpenJDK9 ORB additions](https://github.com/jboss/openjdk-orb-jdk9) 1.0.3.Final

# Eclipse ORBとは

すごーくざっくり言うと・・GlassFishで使用しているORB実装を、Eclipse EE4Jの独立したサブプロジェクトとして開発が行われているライブラリのようです。このライブラリからは、ORB実装だけではなく、idljやrmicなどのツール群も合わせて提供が行われています。なお、このライブラリは、「[JEP 320: Remove the Java EE and CORBA Modules](http://openjdk.java.net/jeps/320#CORBA-and-JTA-modules)」の中で代替ライブラリとして紹介されています。

# JBoss repackaging of the OpenJDK ORBとは

JBossがOpenJDK 8のORB実装を再配布してくれているライブラリのようです。1stリリースが2015年なので・・・JDK 9で非推奨、JDK 11でモジュールが消えることに関係しているかは定かではありません。

# JBoss repackaging of the OpenJDK9 ORB additionsとは

JBossがOpenJDK 9で消えた？ORB関連のクラスを再配布してくれているライブラリのようです。ここには、「[Spring(Java)からCORBAサービスを呼び出してみる](https://qiita.com/kazuki43zoo/items/5eb4d57d785e0b3505fb#spring%E3%81%AE%E6%A9%9F%E8%83%BD%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6corba%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B)」で使っていた「`com.sun.jndi.cosnaming.CNCtxFactory`」が含まれています。




# JavaでCORBAサービスを作ってみる

「[こちら](https://qiita.com/kazuki43zoo/items/5eb4d57d785e0b3505fb#java%E3%81%A7corba%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B)」をご覧ください。IDLファイルからJavaコードを生成する部分については、JDK 11+にはidljコマンドが存在しないので、Eclipse ORBから提供されている[idlj](https://repo1.maven.org/maven2/org/glassfish/corba/idlj/4.2.1/idlj-4.2.1.jar)(executable jar)を使うことで同等のクラスを生成することができます。

```
$ java -jar idlj-4.2.1.jar -fall -td src/main/java src/main/resources/Greeting.idl
```

# JavaでCORBAサービスを公開してみる

## 代替ライブラリの有効化

JDK 11+にはORB実装が存在しないため、何もしないと必要なクラスが見つからずコンパイルができないので、まずは・・・代替ライブラリを使えるようにする必要があります。

### Eclipse ORB編

```xml:pom.xml
<dependency>
  <groupId>org.glassfish.corba</groupId>
  <artifactId>glassfish-corba-orb</artifactId>
  <version>4.2.1</version>
</dependency>
<dependency> <!-- Spring Boot編で「com.sun.jndi.cosnaming.CNCtxFactory」を使うため -->
  <groupId>org.jboss.openjdk-orb</groupId>
  <artifactId>openjdk-orb-jdk9-supplement</artifactId>
  <version>1.0.3.Final</version>
  <exclusions>
  <exclusion> <!-- ORB実装がEclipse ORBと被ってしまうため除外 -->
    <groupId>org.jboss.openjdk-orb</groupId>
    <artifactId>openjdk-orb</artifactId>
    </exclusion>
  </exclusions>
</dependency>
```

### JBoss repackaging of the OpenJDK ORB編

```xml:pom.xml
<dependency>
  <groupId>org.jboss.openjdk-orb</groupId>
  <artifactId>openjdk-orb</artifactId>
  <version>8.1.4.Final</version>
</dependency>
```

## CORBAサービスの公開

ORBが利用可能な状態になったところでCORBAサービスを公開します。詳しくは「[こちら](https://qiita.com/kazuki43zoo/items/5eb4d57d785e0b3505fb#java%E3%81%A7corba%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E5%85%AC%E9%96%8B%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B)」をご覧ください。 JDK 8のorbdコマンドにパスが通っている環境であればソースコードを修正する必要はないのですが、パスが通っていない場合は・・・・以下のような修正が必要になります。

```java
    List<String> orbdStartupCommands = new ArrayList<>();
//    orbdStartupCommands.add("orbd");
    orbdStartupCommands.add("/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home/bin/orbd"); // フルパスでコマンドを指定
    orbdStartupCommands.addAll(Arrays.asList(ORB_OPTIONS));
```

# JavaからCORBAサービスを呼び出してみる

「[こちら](https://qiita.com/kazuki43zoo/items/5eb4d57d785e0b3505fb#java%E3%81%8B%E3%82%89corba%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B)」をご覧ください。修正が必要なところはありません。 

# Springの機能を使ってCORBAサービスを呼び出してみる

「[こちら](https://qiita.com/kazuki43zoo/items/5eb4d57d785e0b3505fb#spring%E3%81%AE%E6%A9%9F%E8%83%BD%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6corba%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B)」をご覧ください。修正が必要なところはありません。 

# デモアプリケーション

本エントリで紹介した内容と完全に一致するわけではありませんが、同等の内容のデモアプリケーションをGitHubに公開してあります。

* https://github.com/kazuki43zoo/democorba/tree/jdk11-wth-eclipseorb (Eclipse ORB編)
* https://github.com/kazuki43zoo/democorba/tree/jdk11-wth-jboss-openjdkorb (JBoss repackaging of the OpenJDK ORB編)

# まとめ

JDK 11でモジュールが消えてしまったCORBAですが、代替ライブラリを使うことでJDK 11+の環境でも使うことができることがわかりました。が・・・代替ライブラリが商用アプリケーションでも利用できるのか？と言う部分が気になりライセンスを調べたところ、

Eclipse ORBは・・・

```:ホームページの抜粋
Eclipse Distribution License 1.0 (BSD)
Eclipse Public License 2.0
一 (Secondary) GNU General Public License, version 2 with the GNU Classpath Exception
```

JBoss repackaging of the OpenJDK ORBは、

```:ライセンスファイルより
GNU General Public License, version 2 with the GNU Classpath Exception
```

のようなので、jarファイルをクラスパス上に追加して使う分には、ソースコードを公開することができない非OSSの商用アプリケーションでも使うことができそうです。