クラスパス
クラスパスは、 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の場合) に保存されます。
ファイル構造は次のようになります。
| マイクロソフトウィンドウズ | リナックス |
|---|---|
D:\myprogram\ | ---> 組織\ | ---> 私のパッケージ\ | ---> HelloWorld.クラス ---> サポートクラス.クラス ---> UtilClass.クラス | /home/user/myprogram/ | ---> org/ | ---> 私のパッケージ/ | ---> HelloWorld.クラス ---> サポートクラス.クラス ---> UtilClass.クラス |
Javaを起動する際には、実行するアプリケーションの名前(org.mypackage.HelloWorld)を指定します。ただし、パッケージを定義するファイルとディレクトリの場所もJavaに伝える必要があります。プログラムを起動するには、以下のコマンドを使用します。
| マイクロソフトウィンドウズ | リナックス |
|---|---|
java -classpath D:\myprogram org.mypackage.HelloWorld | java -cp /home/user/myprogram org.mypackage.HelloWorld |
どこ:
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 | ---> 組織\ | ---> 私のパッケージ\ | ---> 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\*" MyAppLinuxの例:
$ 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 が引数付きで自動的に起動されます。ユーザーは invocation を使用してこのクラス名を置き換えることはできません。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”. 2013年8月6日. 2016年6月26日閲覧。
外部リンク
- Oracle Webサイト上のJavaクラスの検索方法を説明するメモ
- OracleサイトでのClasspathの設定方法の仕様