https://blogs.oracle.com/java-platform-group/entry/closing_the_closed_apis
今年初め、WIREDが次のような記事を発表しました。
Oracle Makes Java More Relevant Than Ever — For Freeこのオープン性はOpenJDKやJava Community Processから伝わってきます。様々な企業や開発者が協調してJavaプラットフォームの将来をガイドしようとしているのです。
http://www.wired.com/wiredenterprise/2013/09/oracle_java/
“Oracle has actually opened up Java even more — getting rid of some of the closed-door machinations that used to be part of the Java standards-making process.”
(Javaの標準策定プロセスの中で使われた非公開の企みを取り除いたという点で、Oracleは実際にJavaをより一層開かれたものにした。)
Javaのオープン化の中には、実際のJava言語仕様およびAPIの蚊帳の外にある、JDKの内部APIの進化に対処することが含まれています。
Java SE Technical Documentation開発者はsun.*パッケージのような内部パッケージを使うべきではありませんが、Javaの18年もの歴史にわたり、様々なアプリケーションがこうしたAPIを様々な理由で使ってきました。
http://docs.oracle.com/javase/index.html
Java™ Platform, Standard Edition 7 API Specification
(英語)http://docs.oracle.com/javase/7/docs/api/
(日本語)http://docs.oracle.com/javase/jp/7/api/
FAQ - Sun Packages : Why Developers Should Not Write Programs That Call 'sun' Packagesこれらの実装固有の内部APIが変わると、課題が浮かび上がり、様々なJava実装間でのアプリケーションの移植性を減少させる可能性があります。コンポーネントライブラリを簡単に入手できることを考慮すれば、内部APIの利用を識別してその利用を軽減し、公開APIを利用するようにする必要があり、その方法を模索しています。
http://www.oracle.com/technetwork/java/faq-sun-packages-142232.html
What's Happening in the Land of Open Source Components (Sonatype Blog)このエントリでは、これらの内部APIの取り扱いに関するトピックをとり上げます。
http://blog.sonatype.com/people/2013/11/open-source-components/
- 内部APIの識別方法
- 現在のターゲット:CORBAおよびApplets/SecurityManager
- JDepsの詳細
Approach in identifying internal APIs
internal API(内部API)の定義は、Java実装が提供するパッケージもしくはクラスのうち、公開されたAPIセットにないものです。JDK8に向け準備を進めていますが、OpenJDKにはjdepsという新しいツールが含まれています。これはアプリケーションのJARファイルやバイトコード内で利用されている内部APIを発見できるものです。jdepsこのツールを実行すると、どのコンポーネントで内部APIを使っているか、どの内部APIを使っているか、がわかります。
http://download.java.net/jdk8/docs/technotes/tools/windows/jdeps.html
jdepsを数多くのアプリケーションで実行し、内部APIの人気を把握し、影響を把握しようとしてきました。
CORBA and Applets/SecurityManager
Java 7 Update 51 (2014年1月)から、内部のドキュメント化されていないcom.sun.corba.seパッケージのAPIを制限APIリスト(restricted API list)に移動する予定です。これにより、以下の3条件すべてに適合するアプリケーションに影響があります。- アプリケーションが制限されたパーミッションを利用している(つまりサンドボックス化されたRIAもしくは、SecurityManagerと共に使う場合)
- CORBAを使っている
- ドキュメント化されていない内部Sun API(com.sun.corba.se.*)を使っている
RFR: 8000450: Restrict access to com/sun/corba/se/impl package何度かのレビューを経て、10月によりよいパッチができました。
http://mail.openjdk.java.net/pipermail/core-libs-dev/2013-June/017673.html
8021257: com.sun.corba.se.** should be on restricted package listJava 7 update 51から、内部CORBA APIは制限APIリストに入ります。これはこの内部APIを使っているRIAがある場合、アプリケーションのmanifestに"Permissions: all-permissions"というエントリを追加しなければならず、しかもサンドボックスを使えないということを意味します。アプリケーションがSecurityManagerを使ってきめ細かいパーミッションを指定しているならば、SecurityManagerで"accessClassInPackage.com.sun.corba.se"パーミッションを指定する必要があります。
http://mail.openjdk.java.net/pipermail/core-libs-dev/2013-October/022403.html
The Security Manager (The Java Tutorials)
http://docs.oracle.com/javase/tutorial/essential/environment/security.html
- コードやコンポーネントがこれらの内部CORBA APIを使っているかどうかを確認するためには、jdepsを使い、"com.sun.corba.se"という出力があるかどうか探します。
- jdepsからの出力にドキュメント化されていない内部APIが利用されている旨の記載がある場合、次の2個の選択肢をとることができます。
- (推奨)ドキュメント化されていない内部APIの代わりに、javax.rmi.CORBAもしくはorg.omg.* APIを使うようにコードを書き換える。
javax.rmi.CORBA
http://docs.oracle.com/javase/7/docs/api/javax/rmi/CORBA/package-summary.html
org.omg.*
http://docs.oracle.com/javase/7/docs/api/org/omg/CORBA/package-summary.html - "Permissions: all-permissions"というmanifestエントリをAppletで利用したり、SecurityManagerから、"accessClassInPackage.com.sun.corba.se"パーミッションを入手することで時間を稼ぐ。是非時間をとって、上記オプションAを選択するようにしてください。
JDeps in detail
OpenJDK 8ではjdepsというユーティリティを導入し、JARファイルをチェックし、内部APIを使っているJARファイルを識別し、見つかったAPIをリスト化しています。このツールは、「これらの内部クラスを使用していますか?」とか「もしそうなら、どれを使っていますか?」といったと質問に答えてくれます。jdepsを使用し、アプリケーションを確認するには、JDK8のプレビューリリースをダウンロードすればいいのです。JDK8上で実際にテストしたりアプリケーションを実行する必要はありません。JDK8なのは、たまたまjdepsユーティリティがある場所ということにすぎません。JDK™ 8 Early Access Releasesソースコードがなくてもjdepsをアプリケーションに対して実行できます。jdepsをアプリケーションに掛けるコマンドは以下のような感じです。
https://jdk8.java.net/download.html
your-application.jdeps.txtには以下のように出力されます。jdk8/bin/jdeps -P -jdkinternals *.jar > your-application.jdeps.txt
your.package (Filename.jar) -> com.sun.corba.se JDK internal API (rt.jar)
0 件のコメント:
コメントを投稿