Java

JavaTM Development Kit
ツールの変更点

JDK 目次
ここでは、バージョン 1.1 以降に、Java Development Kit (JDK) のツールに加えられた変更点について説明し、これに関連して JDK 1.2 の新しいディレクトリ構造とクラスロード機構により生じた問題の概要を説明します。このドキュメントは Windows 版と Solaris 版の両方に適用されますが、ディレクトリの区切り文字は Solaris のものを使用します。次の項目について説明します。

ツールの変更点

  1. JDK 1.2 では、javac の -O オプションの意味が変わり、旧バージョンのコンパイラに比べ、生成されるコードにパフォーマンス上のさまざまな効果を与えることができるようになりました。また、-O オプションでは -depend オプションが暗黙的に指定されなくなったので、必要な場合には -depend をコマンド行に追加しなければなりません。

  2. JDK 1.2 のクラスファイルに対応してコンパイルするには、バージョン 1.1.4 以降の javac を使用する必要があります。バージョン 1.1 の javac は、不正な内部クラス属性を生成することがあります。バージョン 1.2 では、javac は正しい属性を生成します。バージョン 1.1.4 以前の javac コンパイラは、正しい形式を処理するときにクラッシュする可能性があります。バージョン 1.1.5 からは、javac は、修正された新しい属性と古い属性の両方を処理します。

    これはコンパイル時だけの問題です。1.2 コンパイラで生成されたクラスファイルは、旧版の VM で使用できます。

  3. 新しいセキュリティ関係のツールの説明については、「セキュリティ」を参照してください。

  4. JDK 1.1 では、 コマンド "javap -verify" によりクラスファイルの部分的な検証を実行しました。このオプションは、検証全体のうちの一部分しか実行しなかったため、誤解を招きやすいものでした。そのため、1.2 で削除されました。

  5. Java インタプリタに、標準コマンド行オプションのセットと非標準コマンド行オプションのセットができました。標準セットは、バージョン 1.2 および将来のバージョンの Virtual Machine でサポートされます。非標準オプションは、Sun が開発する将来の Virtual Machine でのサポートは保証されていません。Solaris 用と Windows 用の java の 2 つのオプションセットについては、それぞれ Solaris 用の説明と Windows 用の説明を参照してください。

  6. これは、JDK のバージョン 1.2 および 1.1.4 と、それより前のバージョンとの間の非互換性の問題です。1.1.4 より前のリリースでは、Java インタプリタは、クラス c がパッケージ a.b.* 内にある場合でも、/a/b/c.class のクラスファイルを /a/b ディレクトリ内からコマンド "java c" によって直接呼び出すことを許可していました。バージョン 1.1.4 と 1.2 では、完全指定されたクラス名を指定する必要があります。たとえば、a/b/c.class にあるクラス a.b.c を呼び出すには、ディレクトリ /a の親ディレクトリから、コマンド "java a.b.c" を発行します。

  7. バージョン 1.1.x のバグのため、1.1.x の "javakey" ツール (現在は使用されていない) を使用して署名されたコードは、JDK 1.2 では署名なしと認識されます。バージョン 1.2 を使って署名されたコードは、バージョン 1.1.x では署名なしと認識されます。

  8. 1.2 より前のバージョンでは、javac のコマンド行オプションに矛盾や重複があっても許される場合がありました。たとえば、-classpath が複数回指定されている場合は、最後の指定が有効になりました。1.2 では、このような使用法は許可されません。

  9. バージョン 1.2 以降では、javadoc ツールでいくつかの新しいファイル名規約が使用されます。

    ドキュメンテーションコメントの中にハードコーディングされたリンクはすべて、この変更によって壊れます。ドキュメンテーションコメントにはハードコーディングされたリンクを含めることはできません。かわりに、{@link} タグを使用してください。詳細は、javadoc を参照してください。

ディレクトリ構造の変更点

  1. バージョン 1.2 以降の JDK ソフトウェアのディレクトリ構造は、次のとおりです。ただし、すべてを含むものではありません。
                       C:¥jdk1.2
                ___________|________________
               |           |                |
              bin         lib              jre
               |           |         _______|__________
           java.exe    tools.jar    |                  |
           javac.exe               lib                bin
           javap.exe              /   ¥              /   ¥
           javah.exe            ext  rt.jar     classic   java.exe
           javadoc.exe          /    i18n.jar      /      java.dll
                        iiimp.jar               jvm.dll   awt.dll
    
    ここに示した構造は、Windows 版 JDK ソフトウェアのものです。Solaris 版 JDK ソフトウェアのディレクトリ構造も、同様に変更されています。

    JDK ソフトウェアの classes.zip アーカイブに含まれていたクラスファイルは、現在は 3 つのファイルに分割されています。

    Win32 版の JDK ソフトウェアでは、Java Virtual Machine 用の DLL ファイル jvm.dlljre¥bin¥classic ディレクトリにあります。また、JDK 1.2 ソフトウェアのディレクトリ構造に、classic ディレクトリが追加されました。

    java.home システムプロパティの値は、以前は JDK ソフトウェアがインストールされているディレクトリでしたが、現在は jre ディレクトリです。

    tools.jar アーカイブは、JDK ツールが使用するデフォルトのシステムクラスパス上にはありません。つまり、たとえば javadoc のドックレットをコンパイルするためには、tools.jar をクラスパス上に置く必要があります。

    javac -classpath <path to tools.jar> MyDoclet.java
    
    別の例として、次のようなコマンドがあります。
    java sun.tools.javac.Main MyClass.java 
    
    このようなコマンドは、以前のバージョンの JDK ソフトウェアでは動作しましたが、現在はクラスパスが設定されていなければ動作しません。まず最初に、CLASSPATH 環境変数を設定するか -classpath オプションを使用して、tools.jar を明示的にクラスパス上に置く必要があります。
    java -classpath <path to tools.jar> sun.tools.javac.Main MyClass.java 
    
    JDK コンパイラ (Solaris では javac、Win32 では javac.exe) はこれを自動的に行うので、コンパイラを直接起動する場合には、tools.jar をクラスパス上に置く必要はありません。
    javac MyClass.java
    
    コンパイラの使い方としては、この方法が推奨されています。

    この問題および関連する問題の詳細は、「1.1 から 1.2 へのコマンド行の変更」を参照してください。

  2. JDK 1.2 では、Java Virtual Machine の実装とランタイムのサポート (runtime) が、"jvm.dll" (Win32) と "libjvm.so" (Solaris) という名前の共有ライブラリにインストールされています。バージョン 1.1 では、Win32 と Solaris の Runtime は、それぞれ "javai.dll" と "libjava.so" に属していました。 Runtime と一部のクラスライブラリのネイティブメソッドの両方が、バージョン 1.1 の共有ライブラリに含まれていました。バージョン 1.2 では、 Runtime を別のバイナリ製品に分離しました。クラスライブラリのネイティブメソッドは、"java.dll" と "libjava.so" に移動しました。この変更点は、次のどちらかに該当するユーザには重要です。

    上記のどちらかに該当する場合には、ネイティブライブラリのリンクを設定し直さなければバージョン 1.2 では使用できません。Solaris では、リンクのコマンド行の -ljava-ljvm に置き換える必要があります。Win32 で Microsoft VC++ リンカを使っている場合は、

    link -dll -out:mylib.dll -libpath:%JAVA_HOME%¥lib javai.lib
    
    上の行を、下の行に置き換える必要があります。
    link -dll -out:mylib.dll -libpath:%JAVA_HOME%¥lib jvm.lib
    
    この変更は、JNI でネイティブメソッドを実装しているプログラマには影響しません。

    ネイティブメソッドを JNI に移植することを強くお勧めします。JNI は、ネイティブライブラリを Java プログラミング言語と相互運用させるための標準手法であり、JNI はどんなネイティブコードにも Virtual Machine の独立性を提供します。旧 NMI は、将来はサポートされなくなる予定です。


Copyright © 1995-98 Sun Microsystems, Inc. All Rights Reserved.

フィードバック
Sun

Java ソフトウェア