情報科学屋さんを目指す人のメモ

方法・手順・解説を書き残すブログ。私と同じことを繰り返さずに済むように。

JDK付属の「src.zip」の代わりに「jdk7src」を使ってEclipseの「Source not found」を回避する方法

Eclipse (60) Java (38)

JDKには、Java標準ライブラリのソースファイル一式(src.zip)が付属しています。しかし、これは標準ライブラリのソースコードの一部に過ぎず、「sun.misc.Launcher」をはじめとする、一部のパッケージのソースファイルは含まれていません

今回は、それによって表示されるエラーや対策、について解説します。JDK7が対象なので、JDK6未満の場合は適用できません。

「src.zip」のよくある利用法

JDKに付属しているsrc.zipは、Eclipseで標準ライブラリのJavadocを表示できるようにしたり、デバッグ時にステップ実行やブレークポイントを挿入できるようにするためによく利用されます。

ちなみにsrc.zipを登録するためには、次のような方法があります。

  • Package Explorerで「JRE System Library>rt.jar」を右クリックして「Java Source Attachment>External File」でsrc.zipを指定する方法
  • 次のSource not foundエラーが表示されたときに「Attach Source」からsrc.zipを登録する方法

JDK付属の「src.zip」だけでは見れないソースコードがある!

たとえば、とあるクラスを始めて「new」するところで「Step Into」すると、コンストラクタの前にクラスローダが呼ばれ、「sun.misc.Launcher」クラスにジャンプするのですが、src.zipをアタッチしていても、ソースコードは表示できません

Class File Editor

Source not found

The source attachement does not countain the source for the file Launcher.class.
You can change the source attachment by clicking Change Attached Source below:

src.zipをちゃんとアタッチしていても、sun.misc.Launcherのソースコードが表示できないのです。それはなぜかというと、実は、src.zipには、「sun.*」などの一部のソースコードが含まれていないのです。

src.zipって書いてあったら、なんとなく全部含まれていそうですよね(参考:Java - Wikipedia)。

「sun.*」など一部のソースコードが非公開だったから

もともとJava標準クラスライブラリはオープンソースではなく、ある程度のソースコードは公開していたものの、「sun.*」を始めとするいくつかのパッケージは公開の対象外でした。なので、足りていないというか、非公開だったわけです。

OpenJDK→JDK7へ

しかし、その後オープンソース化が行われ、OpenJDKとなり、いろいろあって気がつけばOpenJDKがJDK7のリファレンス実装となりました。

そういうわけで、JDK7からは実装のほとんどがOpenJDKと共通になったようです(参考:Sun社のJDK7、OpenJDK、そしてIcedTea:曖昧さの回避)。

OpenJDKのライセンス的にソースコードは無理?

じゃぁどうしてJDK7になってもsrc.zipの中身が足りないんだ、と思ってしまうのですが、おそらくOpenJDKのライセンス(GPLリンク例外つきGNU GPL)では、ライブラリとしてのリンクまでなら大丈夫な(影響を受けない)ものの、JDK7にOpenJDK7のソースコードを含めて一緒に配布するわけにはいかないから、かなー、と思われます。

jdk7src「src.zipに足りないものをOpenJDKから持ってきました」

そこで「じゃぁ、自分でOpenJDKからソースコードを持ってこよう!」と思ってやってみた人が「やばいめんどくさいビビった」と思って作られたのがjdk7srcです。

jdk7srcでは、「ソースコードが公開されているけれど、JDKのsrc.zipには含まれていないソースコード」をOpenJDKから持ってきて、src.zipと組合せひとつにまとめたファイルを、JDK7の各バージョン毎に提供しています。

jdk7srcを使ってみる

jdk7srcのページにある「JDK7u9」などのリンクから、「src-jdk.zip」をダウンロードしてきます。

そして、「src.zip」と名前を変えて、JDKの「src.zip」と置き換えてあげるだけです。

すると、よく遭遇するのに表示できなかった「sun.misc.Launcher」へStep Intoしたとしても、Source not foundが表示されずに、ちゃんとソースコードが表示されるようになりました。

コメント(0)

新しいコメントを投稿