2011-10-31 3 views
1

this pageの情報は、良いヒントと一般的な情報を提供しますが、決定的なものはありません。javacはJava APIクラスをどのように見つけますか?

javac.exeは基本的に、Javaを使用して 'tools.jar'から 'sun.tools.javac.Main'を起動するだけです。また、Java APIクラスはJDKの下の 'jre/lib'の 'rt.jar'に格納されていることも知っています。これは 'javac.exe'がJava APIクラスをロードする場所ですか?

私はこのシナリオについて特に疑問に思っています:jdk1.6.0_17をインストールし、後でjdk1.6.0_25をインストールしたとします。 jdk1.6.0_17から 'javac.exe'を実行すると、1.6.0_17または1.6.0_25に 'rt.jar'のJava APIクラスがロードされますか?

私がこのすべてを知りたい理由は、私がコンパイルしているコードが特定の(最新ではない)バージョンのJavaで動作することを知っている状況です。コンパイルしたいjavacとJava APIの正確なバージョンを使用して互換性を保証します。

+0

を使用したい場合は、別のビルドシナリオを設定するには、あなたのIDEでの可能性がないCross Compilation - >例えば:

はでより多くを参照してください。 2つの異なるJDKバージョンを使用して、2つの異なるビルド設定を構成しますか?私はNetBeansでこれを使用していますが、Eclipseでも提供されている機能だと思います。 JAVA_HOMEを変更すると動作しますが、頻繁に行う必要がある場合は迷惑になります。 – hovanessyan

答えて

2

デフォルトでは、javacが同梱されているプラ​​ットフォームのブートストラップ(rt.jarのランタイムクラス、i18n.jarの国際化クラスなど)および拡張クラスに対してクラスがコンパイルされます。はいはいjavac .exe 'をjdk1.6.0_17から削除すると、1.6.0_17ではなく1.6.0_25のJava APIクラスが' rt.jar 'からロードされます。

しかし、javacはクロスコンパイルもサポートしています。ここでは、クラスが異なるJavaプラットフォーム実装のブートストラップクラスと拡張クラスに対してコンパイルされています。あなたは

+0

短く正確です。 +1! –

+0

ああ、私はAPIクラスがブートストラップと拡張クラスとは別のものだと思っていました。これは多くの意味があります。クロスコンパイルも私のために働くかもしれません、提案のおかげで。 –

+0

あなたを助け、あなたもG_Hを魅了する喜び。 :-) –

2

JAVA_HOME環境変数を目的のJDKに設定します。また、PATH環境変数を変更して、目的のJDK binディレクトリを格納します。

+0

また、Javaには共有ライブラリを解決するためのCLASSPATHという概念があるので、それに応じてそれを調整する必要があるかもしれないことに注意してください。 –

+0

私はそれがjavacに影響を与えるとは思わない。 Antのようないくつかのツールは、これを使ってデフォルトのJDKパスを見つけ出します。しかし、質問者はビルドツールを指定していませんでした。 –

+0

Antが関わっていますが、私は 'fork'と' executable'プロパティを使って 'javac.exe'を別のプロセスとして起動させています。私はtools.jarから 'javac'を起動しようとするAntに悩まされました。なぜなら、私はこのすべてのトラブルに行くつもりです。 –

関連する問題