argius note

プログラミング関連

Java SE 8 (5) - プラットフォーム、セキュリティー、他

最後に、API改良の残りのセキュリティー関連と、プラットフォームの変更、etc、について、説明します。
(2014-03-21追記)APIドキュメントのリンクを差し替えました。

  • 目次
    • モジュール化の準備
    • コンパクトプロファイル
    • セキュリティー関連
    • Javadoc APIのjavax.toolsへの追加
    • JNIネイティブライブラリーの静的リンク

モジュール化の準備

Project Jigsawで知られるモジュール化ですが、Java8では導入が見送られました。
その代わり、Java9以降でモジュール化を導入する際に障碍となると思われる問題を事前につぶしていく準備が進められています。

Java8では、次のような準備が行われています。

  • クラスローディングの問題の取り組み
  • 独自のサービスプロバイダーメカニズムをServiceLoaderに置き換える
  • ライブラリーとの依存関係を解析するコマンドラインツール(jdeps)の提供
  • モジュール化の大きな障害となるAPIを非推奨にマーク
  • JAVA_HOME内のファイル参照を個別にする


jdepsについては、実行結果のイメージをGistに載せてみました。


もう一点、APIを非推奨(Deprecated)にする対応については、ちょっと補足しておきます。
Java SEのAPIの中では*1、以下のメソッドが非推奨になっています。

これらのメソッドは、JavaBeans APIjava.beansパッケージ)のPropertyChangeListenerインターフェイスのオブジェクトをパラメーターにしています。
ところが、PropertyChangeListenerを含むJavaBeans APIというのは、GUI向けのAPI*2で、パッケージ単位ではAWTやSwingなどに依存しているんです。そのため、これらのメソッドを使っていると、モジュールからGUI関連のAPIを排除することができなくなってしまいます。


実際の開発でも、IDEを使っていると、テキトーに使えそうなクラスを補完で使ってしまったりすることもありそうなので、次項のコンパクトプロファイルを使って業務ロジックはcompact2に限定しておけば、こういう問題は防げるようになりますね。Java8が現場に導入されるようになるのはかなり先になりそうですけれど。


コンパクトプロファイル

Javaの将来のバージョンで、Java SEとJava MEの統合が予定されています。
また、JavaアプリケーションをJREごと配布する場合に、フルセットのJREを同梱しなければならないという問題がありました。


Java8では、コンパクトプロファイルを定義することで、GUIコンポーネントやEE向け機能を使用しないようなアプリケーションは、それを含まないサブセットで配布することができるようになります。
たとえば、これまでJava MEの領域だった小型端末向けのアプリケーションを、Java SEでデプロイできるようになります。Java SEのアプリケーションも、JREを同梱する場合に軽量化することができるようになります。


プロファイルは、以下の条件を満たす必要があります。

  • プロファイルの5つの制約(意訳、原文はこちら ⇒ JSR 337: Java SE 8 - 8. Profiles
    • JVM仕様を全体を完全に満たすこと(コンパクト化できない)
    • Java言語仕様を完全に満たすこと(コンパクト化できない)
    • パッケージ単位で分割し、サブセットのすべてのパッケージはフルセットのものと同じ内容であること
    • 大きなプロファイルは小さなプロファイルのパッケージをすべて含むこと
    • 最小のパッケージにはJava言語仕様の中に出てくるパッケージをすべて含むこと

以下のリストは、それぞれのコンパクトプロファイルの大まかなグループ分けをしたものです。
中には例外もあります。例えばXMLは、標準はcompact2に、暗号化はcompact3に含まれます。Webサービス向けXML機能はコンパクトプロファイルに含まれません。

  • compact1
  • compact2
  • compact3
    • インストゥルメンテーション
    • 監視と管理(management)
    • ネームサービスアクセス(naming)
    • JDBC(compact2に含まれない、rowsetなど)
    • セキュリティー(compact2に含まれない、Kerberosネットワーク認証など)
    • XML暗号化

コンパクトプロファイルに含まれないAPIには、アプレット、AWT、JavaBeans、ユーザー補助、注釈拡張、暗号化、Image I/OWebサービスとそれに関連するXML(JAXB、JAX-WS)、印刷サービス、サウンド、Swing、CORBA(RMI-IIOP含む)などがあります。


セキュリティー関連

セキュリティーに関する変更をまとめてご紹介します。

HTTP URL のアクセス権

セキュリティーマネージャーが有効になっている環境下でHTTPアクセス権を設定する場合、従来はjava.net.SocketPermissionクラスを使って、IPアドレスかホスト名+ポート番号を指定する方法しか使えませんでした。


Java8では、java.net.URLPermissionを使って、java.io.FilePermissionと似たようなパス名の指定ができるようになっています。


設定変更可能なセキュアー乱数ジェネレーター

java.security.SecureRandomクラスに新しくgetInstanceStrongメソッドが追加されました。

getInstanceStrongメソッドを使うと、セキュリティー設定ファイルのsecurerandom.strongAlgorithmsプロパティに指定したアルゴリズムを使ったSecureRandomインスタンスが取得できます。


セキュリティー設定ファイルについては、java.security.Policyクラスを参照してください。


証明書失効チェックAPIの強化

証明書パスの失効チェックを行うjava.security.cert.CertPathCheckerインターフェイスが新規追加されました。java.security.cert.CertPathValidator#getRevocationCheckerCertPathCheckerインスタンス(実体はSPIで生成される)を取得することができます。


限定されたdoPrivileged

java.security.AccessControllerクラスのdoPrivilegedメソッドとdoPrivilegedWithCombinerメソッドに、java.security.Permissionクラスの可変長パラメータを持つオーバーロードメソッドが追加されました(doPrivileged(PrivilegedAction, AccessControlContext, Permission...)他、計4メソッド)。

これにより、doPrivilegedを実行した際の、チェックが不要な権限の「スタックウォーク」を回避することができるようになっています。


NSA Suite B 暗号アルゴリズム

NSA Suite Bをサポートするため、暗号アルゴリズムが強化されています。


TLSのServer Name Indication(SNI)拡張

調査中。


外部XMLリソース取得の制限

調査中。
JAXPにて、外部XMLリソースの取得を制限する機能を標準化したもの?
プロパティーを指定する?



Javadoc APIのjavax.toolsへの追加

javax.toolsは、javacjavadocを、新しいプロセスを生成しないで実行できるようにするためのAPIパッケージです。

このパッケージに、DocumentationToolインターフェイスが追加されました。ToolProvider#getSystemDocumentationToolメソッドでインスタンスを取得できます。


元の資料によると、(javax.toolsはJava6で追加され、さらに)Java7でDocumentationToolの追加が予定されていたのですが、Javadocはコードが古いためリファクタリングに時間がかかってしまい、Java7では見送られた、という経緯があるようです。

(2014-03-21追記)ツールAPI(javax.tools)でJavadoc出力 #java8も参考にしてください。


JNIネイティブライブラリーの静的リンク

ネイティブライブラリーの静的リンクサポートのため、JNI仕様が拡張されました。
このサポートのために、クラスローディングの一部の仕様も変更になっています。



これで、このシリーズは終了となります。
お読みいただき、ありがとうございました。




*1:他にも、JDK実装固有のAPIについて非推奨になっているものがあるようです。

*2:JavaBeansがGUIに結びついているというのが、ちょっと分かりにくいんですよね。ドキュメントをちゃんと読めばわかりますけどね。