クラスパスは、 Java 仮想マシンまたはJava コンパイラ内のパラメータであり、ユーザー定義のクラスとパッケージの場所を指定します。このパラメータは、コマンドラインまたは環境変数を通じて設定できます。
概要とアーキテクチャ
従来の動的ロード動作と同様に、Javaプログラムを実行すると、Java 仮想マシンはクラスを遅延的に検索してロードします (クラスが最初に使用されるときにのみ、クラスのバイトコードをロードします)。クラスパスは、これらのクラスを定義するファイルをファイルシステム内で検索する場所を Java に指示します。
仮想マシンは次の順序でクラスを検索してロードします。
- ブートストラップ クラス: Java プラットフォームの基本となるクラス( Java クラス ライブラリのパブリック クラスと、このライブラリが機能するために必要なプライベート クラスで構成されます)。
- 拡張クラス: Java Runtime EnvironmentまたはJDKの拡張ディレクトリにあるパッケージ。
jre/lib/ext/ - ユーザー定義のパッケージとライブラリ
デフォルトでは、 JDK 標準 APIおよび拡張パッケージのパッケージのみにアクセス可能であり、それらの場所を設定する必要はありません。すべてのユーザー定義パッケージおよびライブラリのパスは、コマンドライン (またはクラスを含む Jar ファイルに関連付けられたマニフェスト)で設定する必要があります。
Javaプログラムを実行するためのパスの設定
アプリケーション引数として提供
次のクラスを含む org.mypackageというパッケージがあるとします。
- HelloWorld (メインクラス)
- サポートクラス
- ユーティリティクラス
このパッケージを定義するファイルは、物理的にはD:\myprogram ディレクトリ( Windowsの場合) または/home/user/myprogram ディレクトリ( Linuxの場合) に保存されます。
ファイル構造は次のようになります。
Java を呼び出すときは、実行するアプリケーションの名前を指定します: org.mypackage.HelloWorld。ただし、パッケージを定義するファイルとディレクトリを検索する場所も Java に指示する必要があります。プログラムを起動するには、次のコマンドを使用します。
どこ:
javaJava ランタイムランチャーは、SDK ツールの一種です( javac、javadoc、aptなどのコマンドライン ツール)- -classpath D:\myprogram はプログラムで使用されるパッケージへのパスを設定します(Linuxでは-cp /home/user/myprogram)。
- org.mypackage.HelloWorldはメインクラスの名前です
環境変数によるパスの設定
環境変数namedは、CLASSPATHクラスパスを設定するために代わりに使用できます。上記の例では、Windows でも次のように使用できます。
D:\myprogram> CLASSPATHをD:\myprogram
に設定します D:\myprogram> java org.mypackage.HelloWorld
ルールは-classpath、Java アプリケーションの起動に使用するオプションがCLASSPATH環境変数を上書きすることです。何も指定されていない場合は、現在の作業ディレクトリがクラスパスとして使用されます。つまり、作業ディレクトリがD:\myprogram\(Linux の場合/home/user/myprogram/) の場合、クラスパスを明示的に指定する必要はありません。ただし、上書きする場合、"."現在のフォルダからクラスをロードする必要がある場合は、現在のフォルダをクラスパスに含めることをお勧めします。
同じことは、Java ランチャーだけでなく、Java コンパイラーの javacにも当てはまります。
Jarファイルのパスを設定する
プログラムが、物理的にはD:\myprogram\lib\ディレクトリにあるsupportLib.jarというJar ファイルに囲まれたサポート ライブラリを使用し、対応する物理ファイル構造が次のようになる場合:
D:\myprogram\
|
---> lib\
|
---> サポートライブラリ.jar
|
---> org\
|
---> 私のパッケージ\
|
---> HelloWorld.クラス
---> サポートクラス.クラス
---> UtilClass.クラス
次のコマンドラインオプションが必要です。
java -classpath D:\myprogram;D:\myprogram\lib\supportLib.jar org.mypackage.HelloWorld
または代わりに:
D:\myprogram> CLASSPATHをD:\myprogram;D:\myprogram\lib\supportLib.jar
に設定 D:\myprogram> java org.mypackage.HelloWorld
ディレクトリ内のすべてのJARファイルを追加する
Java 6以降では、ワイルドカード表記を使用して、特定のディレクトリ内のすべての jar ファイルをクラスパスに追加できます。
Windows の例:
D:\myprogram> java -classpath ".;c:\mylib\*" MyApp
Linux の例:
$ java -classpath '.:/mylib/*' MyApp
-classpathこれはオプションと環境クラスパス
の両方で機能します。
マニフェストファイルでパスを設定する
プログラムがhelloWorld.jarというJar ファイルに格納され、 D:\myprogramディレクトリ内に直接配置されている場合、ディレクトリ構造は次のようになります。
D:\myprogram\
|
---> helloWorld.jar
|
---> lib\
|
---> サポートライブラリ.jar
helloWorld.jarで定義されているマニフェスト ファイルには、次の定義があります。
メインクラス: org.mypackage.HelloWorldクラスパス: lib/supportLib.jar
マニフェスト ファイルは、新しい行または復帰で終了する必要があります。
プログラムは次のコマンドで起動されます。
java -jar D:\myprogram\helloWorld.jar [アプリ引数]
これにより、引数を使用してクラスMain-Classで指定されたorg.mypackage.HelloWorld が自動的に起動されます。ユーザーは、呼び出しを使用してこのクラス名を置き換えることはできません。Class -Path は、ライブラリhelloWorld.jarの場所を基準としたsupportLib.jarの場所を示します。コマンド ラインのパラメータで許可される絶対ファイル パスも、jar 内部パスもサポートされていません。つまり、メイン クラス ファイルが jar に含まれている場合、org/mypackage/HelloWorld.classは、jar 内のルート上の有効なパスである必要があります。
java -jar-classpath
複数のクラスパスエントリはスペースで区切られます。
クラスパス: lib/supportLib.jar lib/supportLib2.jar
OS固有の注意事項
ファイルシステムと密接に関連しているため、コマンドラインのクラスパス構文はオペレーティングシステムに依存します。[1]例:
- すべてのUnix 系オペレーティング システム ( LinuxやMac OS Xなど)では、ディレクトリ構造は Unix 構文であり、個別のファイル パスはコロン(":") で区切られます。
- Windowsでは、ディレクトリ構造には Windows 構文が使用され、各ファイル パスはセミコロン(";") で区切る必要があります。
これは、クラスパスがマニフェスト ファイルで定義されている場合には適用されません。マニフェストファイルでは、オペレーティング システムに関係なく、各ファイル パスをスペース (" ") で区切る必要があります。
参照
- Java クラスローダー
- Java プラットフォーム モジュール システム
- rpath – ハードコードされた検索パス
参考文献
- ^ 「The Classpath」 。 2016年6月26日閲覧。
外部リンク
- Oracle Web サイトにある、Java クラスの検索方法を説明するメモ
- Oracleサイトでのクラスパスの設定方法の仕様
