21

さて、私はLinuxとコマンドラインに非常に慣れており、Javaにはかなり慣れていません。Javaプログラムを構築するインターンシップを取得しました。私はついに自分のマシン(Windows)でそれを実行しました。次に、テストするためにLinuxマシンに移行してから、実行可能ファイルとして実行する必要があります。私はLinuxについて多くの読書と調査を行い、クラスパスを理解してきましたが、それでも完全に理解することは非常に困難です。まだクリックしていないだけです。例を使用して、クラスパスの目的を簡単な方法で説明できる人はいますか?私にとって最も紛らわしい側面の1つは、実際にjarへの物理パスを定義することです。usrから開始するのですか、それともjvmフォルダーから開始するだけでよいのですか?重要な場合、私のJavaプログラムはjvmフォルダーにありません。誰かが私のためにいくつかの光を当てることができますか?

編集:皆さんの助けに感謝します。私が完全に明確であるとは言えませんが、私の状況についての私の理解ははるかに優れています。

4

5 に答える 5

21

複数のjarファイルa.jar、b.jar、およびc.jarがあるとします。コンパイル中にそれらをクラスパスに追加するには、次のことを行う必要があります

$javac -cp .:a.jar:b.jar:c.jar HelloWorld.java

実行するには

$java -cp .:a.jar:b.jar:c.jar HelloWorld
于 2014-01-03T06:39:57.840 に答える
13

引数を使用し-classpathます。相対パスまたは絶対パスのいずれかを使用できます。つまり、現在のディレクトリからの相対パスを使用することも、ルートから始まる絶対パスを使用することもできます/

例:

bash$ java -classpath path/to/jar/file MyMainClass

この例では、main関数はMyMainClassjarファイルにあり、jarファイルのどこかに含まれています。

コンパイルするには、を使用する必要がありますjavac

例:

bash$ javac -classpath path/to/jar/file MyMainClass.java

環境変数を介してクラスパスを指定することもできます。次の例に従ってください。

bash$ export CLASSPATH="path/to/jar/file:path/tojar/file2"
bash$ javac MyMainClass.java

通常は複雑なJavaプロジェクトの場合は、次の名前のantスクリプトを探す必要があります。build.xml

于 2012-07-12T20:10:46.477 に答える
5

クラスパスは、アプリケーションが参照するクラスを見つけるために、Javaコンパイラ(コマンド:javac)とJVM(コマンド:java)が検索する場所です。アプリケーションが別のクラスを参照することはどういう意味ですか?簡単に言うと、そのクラスをコードのどこかで使用することを意味します。

例:

public class MyClass{
    private AnotherClass referenceToAnotherClass;
    .....
}

これ(javac)をコンパイルしようとすると、コンパイラにはAnotherClassクラスが必要になります。アプリケーションを実行しようとする場合も同じです。JVMにはAnotherClassクラスが必要です。このクラスを見つけるために、javacとJVMは特定の(セットの)場所を調べます。これらの場所は、Linuxではコロンで区切られたディレクトリのリストであるクラスパスによって指定されます(必要なときにAnotherClassを見つけるためにjavac / JVMが検索するディレクトリ)。

したがって、クラスをコンパイルして実行するには、クラスパスにAnotherClassクラスを含むディレクトリが含まれていることを確認する必要があります。次に、次のように呼び出します。

javac -classpath "dir1;dir2;path/to/AnotherClass;...;dirN" MyClass.java //to compile it
java -classpath "dir1;dir2;path/to/AnotherClass;...;dirN" MyClass //to run it

通常、クラスはjarファイル/ライブラリと呼ばれる「バンドル」の形式で提供されます。この場合、AnotherClassクラスを含むjarがclasspahtにあることを確認する必要があります。

javac -classpath "dir1;dir2;path/to/jar/containing/AnotherClass;...;dirN" MyClass.java //to compile it
java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;...;dirN" MyClass //to run it

上記の例では、作業ディレクトリにあるクラス(MyClass.java)をコンパイルしてから、コンパイルされたクラスを実行する方法を確認できます(現在のディレクトリを表すクラスパスの先頭にある「。」に注意してください)。このディレクトリもクラスパスに追加する必要があります。そうしないと、JVMはそれを見つけることができません。

質問で指定したように、クラスがjarファイルにある場合は、必要な残りのディレクトリとともに、jarもクラスパスにあることを確認する必要があります。

例:

java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;path/to/MyClass/jar...;dirN" MyClass //to run it

またはより一般的(いくつかのパッケージ階層を想定):

java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;path/to/MyClass/jar...;dirN" package.subpackage.MyClass //to run it

アプリケーションを実行するたびにクラスパスを設定しないようにするために、CLASSPATHと呼ばれる環境変数を定義できます。

Linuxの場合、コマンドプロンプトで:

export CLASSPATH="dir1;dir2;path/to/jar/containing/AnotherClass;...;dirN" 

または、〜/ .bashrcを編集して、この行を最後のどこかに追加します。

ただし、クラスパスは頻繁に変更される可能性があるため、クラスパスをdirのコアセットに設定することをお勧めします。これは頻繁に必要であり、そのセッションでのみ必要になるたびにクラスパスを拡張します。このような:

export CLASSPATH=$CLASSPATH:"new directories according to your current needs" 
于 2012-07-12T20:12:59.543 に答える
1

Linuxユーザーの場合、次のことを知っておく必要があります。

  1. $ CLASSPATHは、具体的には、Javaが複数のディレクトリを調べて、スクリプトに必要なすべての異なるクラスを見つけるために使用するものです(-cpオーバーライドで明示的に指定しない限り)。-cp(--classpath)を使用するには、すべてのディレクトリを手動で追跡し、プログラムを実行するたびにその行をコピーして貼り付ける必要があります(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ディレクトリに追加します。これで、Javaはドライバーとクラスを探します。

  3. echo $CLASSPATH
    

    は非常に便利であり、返されるものは、スクリプトを実行するために必要なものをJavaで検索するすべてのディレクトリのコロンで区切られたリストのように読み取る必要があります。

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

于 2020-01-20T17:57:14.733 に答える
0

ステップ1。

vi ~/.bashrc

ステップ2.最後にこの行を追加します。

export CLASSPATH=$CLASSPATH:/home/abc/lib/*;  (Assuming the jars are stored in /home/abc/lib) 

ステップ3。

source ~/.bashrc

これらの手順の後、プログラムを直接コンパイルして実行します(例:javac xyz.java)

于 2018-01-15T07:01:19.423 に答える