ClassPathの詳細

3869 ワード

JAVAを使用してJAVAに基づいて作成されたプログラムを開発または実行するには、JDKをインストールした後、一般的に次のような環境変数を設定する必要があります(Windowsの例).
    JAVA_HOME : C:\Program Files\Java\jdk1.8.0_112
    CLASSPATH : .;%JAVA_HOME%\lib;%JAVA_HOME%\jre\lib
    PATH      : your-unique-entries;%JAVA_HOME%\bin

では、それらの役割は何でしょうか.JAVA_HOMEこの変数は、JAVA実行環境のインストールパスを示します.JAVAとの間には、字面の類似度が高い以外に、何のつながりもありません.この変数を構成するには、次の3つの理由があります.
  • は、その後の2つの変数の構成を容易にする.
  • JAVAのアップグレードが容易です.アップグレードする場合は、この変数を新しいバージョンのJAVAインストールディレクトリに指定するだけです.
  • いくつかのアプリケーションは、この変数に依存する.例えばよく使われるWebコンテナTomcatやIDE開発ソフトEclipseなど.

  • 依存変数が適用されていないと判断した場合は、構成しなくてもよい.しかし、最初の2つの利点に基づいて、一般的にはそうすることをお勧めしません.
    CLASSSPATHこの変数は、JAVA実行環境JREが.classファイルを検索するパスを示します.
    PATHこの変数は、オペレーティングシステムが実行可能プログラムを検索するパスを示す.この変数はオペレーティングシステムによって使用され、%JAVA_HOME%\binは、javajavacなどのディレクトリのコマンドラインおよびその他のJDKツールに迅速にアクセスするように構成される.
    この3つの変数の用途を理解して、JAVAプログラムに対して最も重要なのはClassPath環境変数であることを知っていて、それはJAVAプログラムが第三者とユーザーのカスタムクラスを検索する経路を示すため、もし正しく配置しなければ、JAVAプログラムは正常に運行することができません.では、ClassPathを正しく構成するにはどうすればいいのでしょうか.次の4つの方法があります.
  • では、ClassPathのデフォルトの割り当て値は「.」であり、クラスパスが現在のディレクトリとそのサブディレクトリであることを示します.
  • では、上記の環境変数CLASSPATHを使用して設定され、設定後にデフォルトの構成が上書きされます.
  • コマンドラインパラメータ-classpathまたは-cpを使用して設定すると、環境変数構成およびデフォルト構成が上書きされます.
  • manifestファイルを含む実行可能jarパッケージを実行すると、manifestファイルによって設定されたクラスパスは、最初の3つの構成を上書きします.

  • このうち、第3の方式と第4の方式は、他のJAVAアプリケーションに影響を及ぼさずに単一のJAVAアプリケーションを独自に構成することができ、第3の方式の構成ClassPathの使用を公式に推奨している.具体的な配置方法は冒頭で述べたように、以下のような形式である.
        .;%JAVA_HOME%\lib;%JAVA_HOME%\jre\lib
    

    各パスの間に英字のセミコロン';'を使用区切りを行います(linux環境では英語のコロン':'で区切ります).この例の単一のパスはフォルダであり、それ以外に、単一のパスは特定のjarパケットとzipパケットパスであってもよい.クラスファイルのパスが次の場合
        c:\java\workspace\test\classes\com\zdb\Test.class
    

    クラスがcom.zdbパッケージの下にある場合、正しく設定されたClassPathは次のとおりです.
        c:\java\workspace\test\classes
    

    クラスが次のサードパーティjarパッケージを参照している場合:
        c:\java\workspace\test\lib\a.jar
    

    このときClassPathは、
       c:\java\workspace\test\classes;c:\java\workspace\test\lib\a.jar
    

    クラスが複数のサードパーティ製jarパッケージ:a.jar b.jar c.jarを参照している場合、ClassPathは次のようになります.
       c:\java\workspace\test\classes;c:\java\workspace\test\lib\a.jar;
       c:\java\workspace\test\lib\b.jar;c:\java\workspace\test\lib\c.jar
    

    ワイルドカード「*」を使用して、次のように表すこともできます.
       c:\java\workspace\test\classes;c:\java\workspace\test\lib\*
    

    次の点に注意してください.
  • ワイルドカードは、ディレクトリの下の.jarおよび.JARファイルのみに一致し、それ以外は.classファイルにもサブディレクトリにも一致しません.
  • は、mainメソッドが実行される前に、ワイルドカードが自動的に特定のパスに展開され、展開パスの順序はプラットフォームによって異なり、同じマシンの異なる時刻でも異なる.
  • ワイルドカードは、構成の第2および第3の方法のみを適用し、第4の方法manifestファイルではワイルドカードを使用できません.

  • 第2の点について、前の例では、プログラムの実行時に、システム属性java.class.pathを使用して得られたクラスパスは、(abcの順序が変更されていることに注意して):
        c:\java\workspace\test\classes;c:\java\workspace\test\lib\a.jar;
        c:\java\workspace\test\lib\c.jar;c:\java\workspace\test\lib\b.jar
    

    この順序はJVMロードクラスにとって重要です.特別な場合、b.jarとc.jarの両方に同じパッケージ名と同じクラスが含まれていると仮定すると、JVMはc.jarを検索したときにクラスを発見した後、b.jarを検索し続けません.JAVAアプリケーションがjarパケットのロード順序に依存する場合は、ワイルドカードを使用することなくjarパケットの順序を明確に指定する必要があります.
    第3の点について、manifestファイル構成クラスパスは、最初の3つの方法とは少し異なります.形式は次のとおりです.
    Class-Path: jar1-name jar2-name directory-name/jar3-name
      jar4-name ...
      jar-name
    

    セミコロン';'ではなく、パスをスペースで区切ることに注意してください.または「:」.また、クラスパスが多すぎて改行が必要な場合は、2行目から2つのスペースで始まる必要があります.
    付:JAVA類パス公式サイト紹介Manifestファイル類パス説明jarパッケージのロード順序によるBUG