少し古い話題ですが、最近コンパクトプロファイル(Compact Profile)と呼ばれる仕組みがJava SE 8で導入されていたことを知りました。
今後新規案件でJava SE 8を使うことはないかもしれませんが、どのような機能か気になったので簡単に調べたことをメモします。
コンパクトプロファイル(Compact Profile)とは?
Java SE 8でコンパクトプロファイル(Compact Profile)と呼ばれる機能が導入されました。
これは、Javaを動かす環境ごとに必要なAPIのみを選択することができる仕組みのようです。
たとえば、モバイルデバイスなどではリソースが限られるため、実行するプログラムなどをなるべく小さくしなければなりませんが、このようなときに、適切なプロファイルを選択することで軽量化されたJavaの実行環境を構築することができます。
プロファイルの種類
プロファイルは、大きく以下の3つに分かれているようです。これらの違いは含まれるAPIの種類です。
- compact1
- compact2
- compact3
上記は、上から含まれるAPIの種類が少ない順番で並べてあります。因みに、各プロファイルはそれより番号の小さいプロファイルを含む関係のようです。たとえば、compact2はcompact1のAPIをすべて含んでいます。
各プロファイルに含まれるAPIの詳細は、以下のリンクにすべて記載されています。
コンパクト・プロファイル
JavaDocにもプロファイルの記載がある
コンパクトプロファイルを調べたときにはじめて知ったのですが、JavaDocにこのプロファイルの情報が記載されているようです。
たとえば、java.sql.ResultSetはデータベースにSELECTした結果を保持するオブジェクトですが、以下の通りページの上部にプロファイルの記載があります。
このAPIは、プロファイル「compact2」に含まれています。そのため、上位の「compact3」も含めた2つのプロファイルに含まれているということになりますね。また、「compact2」に含まれているので、下位の「compact1」のプロファイルには含まれていないということにもなりますね。
javacでプロファイルの動作確認をしてみる
javacコマンドでコンパイルにする際にどのプロファイルをターゲットにするかを指定するオプションがあるのでこれの動作確認をしたいと思います。
今回確認するJavaのバージョンは以下の通りです。
サンプルコードは、先ほど紹介した、java.sql.ResultSetをフィールド変数に定義しただけの単純なものを以下の通り用意します。
import java.sql.ResultSet; public class Sample { private ResultSet rs; }
まずは、普通にコンパイルしてみましょう。これは何も問題ありません。コンパイルが成功しました。
それでは、次にプロファイルを指定します。プロファイルは、「-profile」というオプションで指定できます。今回は、java.sqlパッケージを含まないcompact1を指定して実行してみます。
このように、javacコンパイラは指定したプロファイルに含まないパッケージがコンパイル対象のソースコードに存在する場合は、エラーにしてくれるようですね。
因みに最初はプロファイルを指定していませんでしたが、この場合はフルセットのJava SE APIに対して実行されるそうです。
おわりに
いかがでしょうか。私自身この機能を全く知らなかったので、こんなのあるんだと驚きました。
因みにコンパクトプロファイルは、Java SE 9以降ではJavaのモジュールシステムに取って代わられたようなので、Java SE 9以降では使えなさそうです。私の環境では、Java SE 17があったのですが、このオプションは使えないというエラーになりました。
上記でコンパクトプロファイルの簡単な説明はしましたが、具体的にどうやってJavaランタイムの実行環境を小さくするのかよく分かりませんでした。あまり使われなかった機能なのか、誰でもわかる!みたいな説明記事が見つからず、今回はそこらへんの確認は断念しました。。
また、調べる内に理解できたら別途紹介したいと思います(恐らく、Javaの実行環境JREとして、compact1などのプロファイル専用のものを別途用意し、必要に応じて使うイメージかな?)。
今回はこの辺で。最後までお読みいただきありがとうございました。