web-dev-qa-db-ja.com

Linuxのクラスパスに複数のjarファイルを追加する方法

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

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

14
exit_1

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

例:

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

この例では、main関数はMyMainClassにあり、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プロジェクトの場合、build.xmlという名前のantスクリプトを探す必要があります

12
Petriborg

複数の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
16
noPE

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

例:

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

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

したがって、クラスをコンパイルして実行するには、クラスパスに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が必要なディレクトリの残りとともにclasspathにもあることを確認する必要があります。

例:

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を編集して、この行を最後に追加します。

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

export CLASSPATH=$CLASSPATH:"new directories according to your current needs" 
5
Razvan

ステップ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)

0
user9218212