BASE64Encoderを使おうとしたら「rt.jarで制限されているためアクセスできません」と言われた件

Eclipse 3.5(Pleiades All in One 3.5.1.20090930でjdk1.6.0_06を使用)でのお話。
Javaプロジェクトを作って、sun.misc.BASE64Encoderを使おうとしたらエラーと表示されました。
メッセージを見ると、「アクセス制限: 型 BASE64Encoder は必須ライブラリー (Javaのインストールディレクトリ)\lib\rt.jar で制限されているためアクセスできません」とのこと。
検索しても対処法がすぐにわからなかったので、メモしておきます。

お急ぎの方のためにまず対処法を。

対処法

プロジェクトのプロパティなどから、ビルド・パスの構成をえらんで、ライブラリーのJREシステム・ライブラリーを表示してください。

ビルド・パスの構成

ビルド・パスの構成

次に、「アクセス・ルール」を選んで、「編集」ボタンを押すとこんな感じの画面が表示されます。

アクセスルール

アクセスルール

で、追加を押して、ルールとして「解決」を「アクセス可能」に、「ルール・パターン」を「sun/misc/*」としてOK(他の画面もすべてOK)してください。

こんな感じ

こんな感じ

すると先ほどのエラーはなくなっているはずです。

どうしてこうなるの?

sun.misc.BASE64Encoderは、Javaで普通にコンパイルする場合には(rt.jarに含まれていれば)エラーではないのですが、Eclipse上でエラーとなっています。
Eclipseでは、Java言語が持っているprivateなどのアクセス制限機能の他に、プロジェクトごとに利用できるクラスを一定の範囲内に制限することができます。
その制限のルールが上述のビルドパスにあるjarのアクセスルールです。

デフォルトのJavaプロジェクトでは、sun.misc.*がアクセスできない状態になっていたので、上述のようにアクセス可能にすることでエラーが出なくなったというわけです。(私の環境のTomcatプロジェクトではそういう制限がなかったので、違いを調べてみて今回のことがわかりました。)
sun.misc.*以外のクラスでも同じようなエラーが出たら同じやりかたで解除できます。(いっそのこと、ルールパターンを「**」にしちゃってもいいかもしれません。)

ちなみに、このルールの機能を使えば、同じ開発チーム内で利用できるクラスを制限したり、たとえばサーブレットを作るときにswingのクラスがコードアシストの候補として表示されるのを防いだりできます。

参考にさせていただいたサイト

あと余談ですが、sun.misc.*には、BASE64Encoder以外にも便利なクラスがいくつかあるので、こちらの「sun.miscを使う」を一度見てみてください。自分で同じ機能を作ってしまう前に。

One Comment

  1. 齢70で孫に”じゅのむ”jeune_homme(仏語)と呼ばせて,javaをものにしようとあがいている年寄りです。
    rt.jarで制限されて・・・が立ちふさがり、eclipseやらJDKのインストールやり直しても動かなかったんですが、貴bitlog内の記事に出会い、壁を取り払うことができました。感謝のいたりです。感謝感謝感謝
    Javaの目標はWiiのリモコンの加速度データをグラフ表示(androidで)させることです。非常に遠い道です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*