クラスパスとは、Java仮想マシンとコンパイラがアプリケーションを起動する際にクラスやリソースを探すディレクトリ、JAR、およびZIPアーカイブのリストを定義するパラメータです。
問題の歴史:
Javaの登場以来、異なるディレクトリにある多数のクラスを柔軟に読み込む必要が生じました。このため、依存関係の検索場所を指定するためにクラスパスが考案されました。
問題:
クラスパスが正しく設定されていないと、アプリケーションは必要なクラスを見つけられず、ロードエラー(例:ClassNotFoundExceptionまたはNoClassDefFoundError)が発生します。
解決策:
クラスパスは、環境変数CLASSPATH、コマンドラインパラメータ-cpまたは-classpathを介して設定できます。アプリケーションの動作に必要なすべてのディレクトリとJARファイルを明示的に指定することが重要です。クラスパスを指定しての実行例:
java -cp ".;lib/*" com.example.Main
主な特徴:
;(Windows)または:(Linux/macOS)で指定できますlib/* — libフォルダー内のすべてのJARクラスパスに記載されていないクラスはJavaが自動的に見つけることができますか?
いいえ、Javaは指定されたクラスパス外のクラスを自動的に探索することはありません。すべてのパスは明示的に指定する必要があります。
クラスパス内のパスの順序はクラスのロードに影響しますか?
はい、クラス名が一致した場合、最初に指定されたパスからクラスが見つかります。バージョンの競合を避けるために順序は重要です。
アプリケーションの起動後にクラスパスに新しいJARを「生」で追加できますか?
いいえ、クラスパスの標準メカニズムはJVMの起動後に静的です。新しいクラスの動的ロードには特別なClassLoaderが必要です。
Javaアプリケーションが-cp lib/mylib.jarで起動され、テスト設定のフォルダーを忘れて追加した場合。結果、ライブラリが存在するように見えてもアプリケーションはエラーで落ちます。
利点:
欠点:
MavenやGradleを使用して、依存関係に基づいて自動的にクラスパスを構成します。ラッパースクリプトを介して起動されます。
利点:
欠点: