クラスパスとは何ですか?どのように設定しますか?


324

私はこの行を読んでいました:

format()メソッドが最初に行うことは、output.vmという名前のクラスパスからVelocityテンプレートをロードすることです。

このコンテキストでのクラスパスの意味と、クラスパスの設定方法を説明してください。

回答:


530

Javaでプログラミングする場合、ソースファイルの先頭に次のようなものを配置することで、作成中のクラスで他のクラスを利用できるようにします。

import org.javaguy.coolframework.MyClass;

または、次のように言って「一括インポート」することもあります。

import org.javaguy.coolframework.*;

したがって、プログラムの後半で次のように言うと、

MyClass mine = new MyClass();

Java仮想マシンは、コンパイルされたクラスの場所を知っています。

VMがマシン上のすべてのフォルダを参照するようにするのは現実的ではないため、VMに参照する場所のリストを提供する必要があります。これは、フォルダーとjarファイルをクラスパスに配置することによって行われます。

クラスパスの設定方法について説明する前に、.classファイル、パッケージ、および.jarファイルについて説明します。

最初に、MyClassがプロジェクトの一部としてビルドしたものであり、プロジェクトのと呼ばれるディレクトリにあるとしますoutput。.classファイルはoutput/org/javaguy/coolframework/MyClass.class(そのパッケージ内の他のすべてのファイルとともに)にあります。そのファイルに到達するために、パスはパッケージ構造全体ではなく、単に「出力」フォルダーを含む必要があります。これは、インポート文がそのすべての情報をVMに提供するためです。

次に、CoolFrameworkを.jarファイルにバンドルし、そのCoolFramework.jarをプロジェクトのlibディレクトリに配置するとします。ここでlib/CoolFramework.jarクラスパスに入れる必要があります。VMはjarファイルの内部org/javaguy/coolframeworkを調べて、クラスを見つけます。

したがって、クラスパスには次のものが含まれます。

  • JARファイル、および
  • パッケージ階層の最上位へのパス。

クラスパスをどのように設定しますか?

誰もが最初に学ぶ方法は、環境変数です。UNIXマシンでは、次のように言うことができます。

export CLASSPATH=/home/myaccount/myproject/lib/CoolFramework.jar:/home/myaccount/myproject/output/

Windowsマシンでは、環境設定に移動して、すでにそこにある値を追加または変更する必要があります。

2番目の方法は、-cpJavaの起動時に次のようにパラメーターを使用することです。

java -cp "/home/myaccount/myproject/lib/CoolFramework.jar:/home/myaccount/myproject/output/"  MyMainClass

これの変形は、クラスパスを計算し、それをパラメーターを介してJavaに渡す.shまたは.batファイルでよく行われる3番目の方法-cpです。

上記のすべての「落とし穴」があります。ほとんどのシステム(Linux、Mac OS、UNIXなど)では、コロン文字( ':')がクラスパス区切り文字です。windowsmでは、セパレーターはセミコロン( ';')です。

それを行うための最良の方法は何ですか?

環境変数を介してグローバルに設定することは、一般的にグローバル変数が悪いのと同じ種類の理由で悪いです。1つのプログラムが機能するようにCLASSPATH環境変数を変更し、別のプログラムを破壊することになります。

-cpを使用する方法です。私は通常、CLASSPATH環境変数が空の文字列であることを確認して、可能な場合は常に開発することで、グローバルクラスパスの問題を回避しています(ただし、一部のツールは、グローバルクラスパスが空の場合に満足できません-何千もの一般的なコマンドラインツールにこの種の問題があるドルライセンスのJ2EEおよびJavaサーバー)。


12
別のよくは上のブログを説明し、JavaのPATHとCLASSPATHは何ですか-クラスパス対パス
KNU

Pythonには、Libと呼ばれるフォルダーがあり、単純なインポートステートメントでいつでも使用できる任意のモジュールを保存できます。これは、CLASSPATH環境変数をサードパーティのJavaパッケージのディレクトリに設定することとは異なりますか?グローバルであっても、パッケージを追加する以外に変数を変更する必要はありません。
Josie Thompson

いい答えですが、ここにいるダミーのために:作成するすべての新しいクラスに対して-cpコマンドを使用する必要がないのはなぜですか?これは確かにシステムによって自動的に解決されますよね?しかし、どうやって?「何か」がクラスパスで見つからないという問題が時々発生します-cpに追加しなかったためにそうなのでしょうが、なぜそのようなエラーが常にではなくたまにしか発生しないのですか?正直なところ、手動​​で-cpコマンドを使用して何も含めず、そのようなエラーで何をすべきかわからないので、これを尋ねます
Vic Torious

2
@Vicクラスパスには、パッケージ名に対応するディレクトリ階層の上のディレクトリを含める必要があります。したがってorg.javaguy.coolfw、対応するディレクトリ構造がある/path/to/org/javaguy/coolfw/場合、クラスパスに含める必要があります/path/to/org.javaguy.hotfw同じプロジェクトに新しいパッケージを追加すると、結果のクラスは(通常)になります/path/to/org/javaguy/hotfw/。これには、クラスパスにが含まれている必要/path/to/があります。そのため、新しいパッケージ(およびそこに含まれるクラス)では、クラスパスに新しい追加を必要としません。
jjalling 2017

@Vicより具体的な例と説明については、JavaのCLASSPATHマスターするKNUの優れたコメントによる
tjalling '24

67

PATH環境変数に対するJavaの答えと考えてください。OSはPATHでEXEを検索し、Javaはクラスパスでクラスとパッケージを検索します。


13

クラスパスは、Java仮想マシンがJavaプログラム内のユーザー定義のクラス、パッケージ、およびリソースを探すパスです。

このコンテキストでは、format()メソッドはこのパスからテンプレートファイルをロードします。


5

このコンテキストでのクラスパスは、一般的なコンテキストでのクラスパスとまったく同じです。VMがロードするクラスを見つけることができるとわかっているところならどこでも、またリソース(この場合はoutput.vmなど)です。

Velocityが「パッケージなし」のどこかにoutput.vmという名前のファイルを見つけることを期待していることは理解できます。これは、JAR、通常のフォルダなどにすることができます...アプリケーションのクラスパス内の任意の場所のルート。


2

CLASSPATHシステム変数の設定

現在のCLASSPATH変数を表示するには、WindowsおよびUNIX(Bourneシェル)で次のコマンドを使用します。Windowsの場合: C:\> set CLASSPATH UNIXの場合: % echo $CLASSPATH

CLASSPATH変数の現在の内容を削除するには、次のコマンドを使用します。Windowsの場合: C:\> set CLASSPATH= UNIXの場合: % unset CLASSPATH; export CLASSPATH

CLASSPATH変数を設定するには、次のコマンドを使用します(例):Windowsの場合: C:\> set CLASSPATH=C:\users\george\java\classes UNIXの場合: % CLASSPATH=/home/george/java/classes; export CLASSPATH


1
これらのコマンドは環境変数を操作するのに役立ちますが、これは質問の答えにはなりません
Hulk

1

クラスパスはシステムの環境変数です。この変数の設定は、Javaコンパイラにパッケージ階層のルートを提供するために使用されます。


1

CLASSPATHは、Javaプログラムで使用されるJavaパッケージを見つけるためにJavaコンパイラとランタイムに必要な環境変数(つまり、すべてのプロセスで使用可能なオペレーティングシステムのグローバル変数)です。(なぜPACKAGEPATHを呼び出さないのですか?)これは、実行可能プログラムを見つけるためにCMDシェルによって使用される別の環境変数PATHに似ています。

CLASSPATHは、次のいずれかの方法で設定できます。

CLASSPATH can be set permanently in the environment: In Windows, choose control panel  System  Advanced  Environment Variables  choose "System Variables" (for all the users) or "User Variables" (only the currently login user)  choose "Edit" (if CLASSPATH already exists) or "New"  Enter "CLASSPATH" as the variable name  Enter the required directories and JAR files (separated by semicolons) as the value (e.g., ".;c:\javaproject\classes;d:\tomcat\lib\servlet-api.jar"). Take note that you need to include the current working directory (denoted by '.') in the CLASSPATH.

To check the current setting of the CLASSPATH, issue the following command:

> SET CLASSPATH

CLASSPATH can be set temporarily for that particular CMD shell session by issuing the following command:

> SET CLASSPATH=.;c:\javaproject\classes;d:\tomcat\lib\servlet-api.jar

Instead of using the CLASSPATH environment variable, you can also use the command-line option -classpath or -cp of the javac and java commands, for example,

> java classpath c:\javaproject\classes com.abc.project1.subproject2.MyClass3

0

クラスの静的メンバーは、オブジェクトインスタンスを作成せずに直接呼び出すことができます。mainメソッドは静的なので、Java仮想マシンは、プログラムの開始点であるmainメソッドを含むクラスのインスタンスを作成せずにそれを呼び出すことができます。


0

Linuxユーザーの場合、およびここで他の人が言ったことを要約して追加するには、次のことを知っている必要があります。

  1. $ CLASSPATHは、Javaが複数のディレクトリを調べて、スクリプトに必要なすべての異なるクラスを見つけるために使用するものです(-cpオーバーライドで明示的に指定しない限り)。-cpを使用するには、すべてのディレクトリを手動で追跡し、プログラムを実行するたびにその行をコピーして貼り付ける必要があります(推奨されるIMOではありません)。

  2. コロン( ":")文字は、さまざまなディレクトリを区切ります。$ CLASSPATHは1つだけあり、その中にすべてのディレクトリがあります。したがって、 "export CLASSPATH = ...."を実行するときは、現在の値 "$ CLASSPATH"を追加して追加する必要があります。例えば:

    export CLASSPATH=.
    export CLASSPATH=$CLASSPATH:/usr/share/java/mysql-connector-java-5.1.12.jar

    上記の最初の行では、現在の作業ディレクトリへのパスである単純な「ドット」だけでCLASSPATHを開始します。これにより、Javaを実行するたびに、現在の作業ディレクトリ(現在の作業ディレクトリ)でクラスが検索されます。上記の2行目の$ CLASSPATHは、以前に入力した値(。)を取得し、mysql dirverにパスを追加します。これで、javaはドライバーとクラスを探します。

  3. echo $CLASSPATH

    非常に便利です。返されるものは、コロンで区切られたすべてのディレクトリのリスト、および.jarファイルのように読み取る必要があります。

  4. TomcatはCLASSPATHを使用しません。ここで何をすべきかを読んでください:https//tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.