目次
大友(@yomon8)です。
久しぶりにSAP Java Connector(SAP JCo)を使った開発をしようと、調べてみたところSAP JCoのバージョン3.1が出ていることに気付きました。(リリースは去年みたいですが)
ちょうど良いタイミングなので一通り調べたことを書いていこうと思います。
注) 記事の中に参照URLを貼っていますが、アクセスするためにSユーザが必要となるリンクもあります
SAP Java Connector 3.0と3.1
前バージョンである3.0と比較も含めて概要を書いてみます。
SAP JCo 3.0のサポート
まず、前バージョンであるSAP JCo 3.0から見てみます。
メインとなっているノートは以下です。ダウンロードリンクなどもこちらに記載があります。1077727 – SAP JCo 3.0 release and support strategy
ノートに以下のように記載があるとおり、2020/10/31でサポート切れのようです。
Maintenance and support for SAP JCo 3.0 will end on October 31, 2020.
SAP JCoの新バージョンとして3.0が出て初めて使ったのは10年くらいは前の記憶があるので、かなり長寿だったのではないでしょうか。
SAP JCo 3.1の変更点と新機能
次に新バージョンの3.1は何が変わったのか見てみます。
まずメインとなるノートは以下となります。ダウンロードリンクは変わってないです。2786882 – SAP JCo 3.1 release and support strategy
SAP JCo 3.0との互換性
実際にSAP JCoをダウンロードすると、中にドキュメントが含まれていて、その中にあるREADMEを見る限り、3.0で既にDeprecatedとなっていたMethodやFieldを使っていない限りは、3.1でも互換で動くようです。
サポートされるJavaのバージョンが変更
全体として大きく変わったところにサポートされるJava SEのバージョンがあります。
SAP JCo 3.0では以下の通りJava SE 5~11までの広いバージョンがサポートされていました。
JCo 3.0 is supported for the SAP JVM 5, 6, 7, 8 and for the SapMachine 11 as well as for the Java 5, 6, 7, 8 and Java 11 Standard Editions
これがSAP JCo 3.1では以下のようにJava SEの8と11のみがサポートされます。双方ともJavaのLTS(Long Term Supported)となっているバージョンとなります。
JCo 3.1 is supported for the SAP JVM 8 and for the SapMachine 11 as well as for the Java 8 and Java 11 Standard Editions of several 3rd party JVM vendors.
また気になるところとしてOpenJDKやOracle JDKではなく、SAP JVMまたはSapMachineが推奨環境として記載されています。この辺りは後述します。
It is recommended to use the SAP JVM or the SapMachine, because it adds further diagnostic support features and it is also not subject to the end-of-maintenance restrictions of the JVMs of other vendors.
SAP JCo 3.1の新機能
SAP JCo 3.1に含まれるJava DocのREADMEに記載がありますので一部抜粋します。
まず一番上に書かれている以下ノートの機能が気になります。
2372888 – Fast serialization in RFC
列指向の高圧縮の形式でデータをシリアライズできるようです。SAPのような大きなデータを持つサービスに対して、外部からデータを扱うならあって欲しい機能です。SAP_BASISのバージョンなど制約はあるようですが、期待です。
他にもWebSocket RFCに対応していたり、取得したレコードをJSONに変換できたり、高可用性構成に対応したり、細かいところではSocketのBuffer Sizeを変更できるようになっていたり、所謂IoTやビッグデータと言われる領域のサービスと連携しやすくなるのではと感じました。
JCo 3.1のJDK/JVM
上の方でも記載しましたが、SAP JCoのJava実行環境は、SAP JVMとSAPMachineが推奨と明記されています。双方ともSAP社が提供のJava SE環境です。
この二つの違いを以下に書いてみました。
SAP JVM
Oracle SDKをSAPが拡張しているものです。
- ■ライセンス
- Oracleにライセンスされています
- ■対応するJava SEバージョン
- 8以前
- (現在は5~8、昔は4もあった、ノートには9の存在もあるのでリリースされるのかも)
- ■ソースコード
- 非公開(バイナリ提供)
- GitHubにSAP社のリポジトリが存在しますが、実体は含まれません
- ■サポート期限
- 現在最新のSAP JVM 8.1で2027/12/31までと記載されています(PAMでJavaを利用する製品を選択するとJSE Platformから確認できます)
- ■ダウンロード
- https://tools.hana.ondemand.com/#cloud(Sユーザ無しで最新版がダウンロードできます)
- 1442124 – How to download a SAP JVM patch from the SMP(過去のバージョンもダウンロードできます)
- ■その他
- Oracle JDKとSAP JVMのバージョンの対応表です
- ヘルプはSAP Help Portalから確認できます
SapMachine
SAP社がOpenJDKをフォークしビルドしたものです。SAPカスタマーは、SAPのサポートを受けることができます。
OpenJDKプロジェクトが開発母体となりますし、SapMachineのホームページにも記載がありますが、SAPはOpenJDKプロジェクトのbiggest external contributors とのことです。以下の図でいうとOracle以外のContributorsの中でも大きな貢献をしていることがわかります。
ということで、SapMachineはOpenJDKと深く紐付いてい開発されてきています。
このような形をOpenJDKディストリビューションと呼ぶようです。同じようなタイプのJDKでクラウド業界で有名なのものとしてAWSのCorrettoがあります。
Oracle JDKやOpenJDKの関係性はなかなかに複雑なので、詳しく知りたい方は、こちらの資料が、とてもわかりやすかったのでご紹介しておきます。(SapMachineの話も出てきます)
[SlideShare]これからのJDK/JVM 何を選ぶ?どう選ぶ?
では、SapMachineの特徴を見ていきます。
- ■ホームページ
- ■ライセンス
- GPL v2 + Classpath Exception
- ■対応するJava SEのバージョン
- 11以降
- (現在の最新は14)
- ■ソースコード
- GitHubに公開されています
- OSSですがSAP CustomerはSAPのサポートを受けることができるのがポイントです
- ■サポート期限
- GitHubのWikiに記載があります
- 今の最新のLTSはバージョン11でEnd Of Lifeは2022/09となります
- LTSは3年ごとにリリースされるので、次はバージョン17は2021/09にリリースになりそうです
- ■ダウンロード
- GitHubのWikiにインストール方法が記載されています
- ■その他
- 公式のDocker Imageが提供されているのも面白いので後で使ってみます
SAP JVMとSapMachineどちらを使うべきか
ここはタイミングや要件にもよると考えます。
例えば、今の時点ではSapMachineのLTSは2022/09と比較的近いので、Javaのバージョンアップが大変そうなサービスならSAP JVM 8.1の方が良い場合もありそうです。
例えば、他にも元となっているコードがJava SE 11で書かれているとか、SAP JVMでは実装されてないG1GC使いたいとか、OSSのオープン性がメリットになるなどあれば、SapMachine使う方が良い場合もあるかもしれません。
例えば、AWSに乗っている環境でSAP連携部分がごく一部ならCorretto上でSAP JCo動かすことも検討対象に上がってくるかもしれません。
これらはあくまで一例です。
SAP JCo 3.1をSapMachineで実行してみる
最後にSAP JCo 3.1をSapMachine上で実行してSAPに繋いでみます。
この記事も長くなってきたので、ソースコードを書くのは止めて、せっかくSapMachineには公式のDocker Imageが用意されているので、これを使ってSAP JCoに含まれるExampleを簡単に実行だけしてみます。
まずはこちらからSAP JCo 3.1をダウンロードします。
ダウンロードしてきたSAP JCoのファイルを解凍していきます。
# ダウンロードしたSAP JCo 3.1のZIPファイルです
$
ls
-1
sapjco31P_2-70004517.zip
# ZIP解凍します
$ unzip sapjco31P_2-70004517.zip
Archive: sapjco31P_2-70004517.zip
inflating: sapjco3-linuxx86_64-3.1.2.tgz
inflating: SIGNATURE.SMF
# ファイルは以下の通り。この時点ではまだtgzファイルで圧縮されてます。
$
ls
-1
SIGNATURE.SMF
sapjco3-linuxx86_64-3.1.2.tgz
sapjco31P_2-70004517.zip
# tgzファイル(SAP JCo3.1)の解凍先のフォルダを作成します
$
mkdir
sapjco31
# 解凍します
$
tar
xf sapjco3-linuxx86_64-3.1.2.tgz -C .
/sapjco31/
この時点のディレクトリ構造は以下の通りです。
SAP JCoのExampleから CallUsingStructure.javaを実行してみます。 これはRFC_SYSTEM_INFOという汎用モジュールを実行するものです。無害のはずですが、もし実行する場合は開発やテスト環境向けにしてください。
では実行してみます。
# 解凍先フォルダを/optにマウントしてSapMachineのDockerイメージを起動します
$ docker run -it -
v
$(
pwd
)
/sapjco31
:
/opt/sapjco31
sapmachine:11.0.7
/bin/bash
# ※ここからはDockerイメージ内での操作です
# SAP JCo解凍フォルダをマウントしたフォルダに移動します
$
cd
/opt/sapjco31
# 接続設定ファイルを準備します。
# YOUR_IP_ADDRESS等は自身の環境の値に置換してください
$
cat
<<EOF
>.
/ABAP_AS1
.jcoDestination
jco.client.ashost=YOUR_IP_ADDRESS
jco.client.sysnr=00
jco.client.client=001
jco.client.user=YOUR_USER_NAME
jco.client.passwd=YOUR_USER_PASSWORD
jco.client.lang=en
EOF
# SAP JCoのExampleをコンパイルします
# コンパイル先のディレクトリを作成します。
$
mkdir
class
# コンパイル実行します
$ javac -d .
/class
-
cp
.
/sapjco3
.jar:.
/examples
.
/examples/com/sap/conn/jco/examples/client/beginner/CallUsingStructure
.java
# Exampleに用意されたコードを実行します
$ java -
cp
.
/class
:.
/sapjco3
.jar:.
/examples
com.sap.conn.jco.examples.client.beginner.CallUsingStructure
実際に実行した画面です。
WSL2でDocker使える環境ならばどのPCでも再現できると思います。
最後に
簡単なSAP JCoのExampleを実行するまでに、だいぶ遠回りしてしまいました。
ただ、何となくわかるようでわかってなかったOracleやOpenJDK周りを、SAP JVMとSapMachineの違いなどを通して知ることができたのは良かったです。