2012-07-12 95 views
11

私はLinuxやコマンドラインでは初めてです。私は、Javaプログラムを構築するインターンシップを持っています。私は最終的にそれを私のマシン(ウィンドウ)でやってしまったので、テストするためにそれをLinuxマシンに移行してから、実行可能ファイルとして実行する必要があります。私はLinuxで多くの読書や研究を行い、クラスパスを理解していますが、まだ完全に理解することは非常に難しいです。それはまだ私のためにクリックしていないだけです。例を使って簡単にクラスパスの目的を説明できる人はいますか?私にとって最も混乱する側面の1つは、実際には瓶への物理的経路を定義することです。私はusrからすべての方法を開始するのですか、またはjvmフォルダから始めるだけですか?重要な場合、私のJavaプログラムはjvmフォルダにありません。誰か私のためにいくつかの光を当てることができますか?linuxのclasspathに複数のjarファイルを追加するには

編集:皆さん、ご協力いただきありがとうございます。私は完全にはっきりしているとは言えませんが、自分の状況をよく理解しています。

+0

[Javaクラスパス内のディレクトリにすべてのjarを含める](https://stackoverflow.com/questions/219585/including-all-the-jars-in-a-directory)の可能な複製-within-the-java-classpath) – Stewart

答えて

10

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

例:

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

この例でmain機能MyMainClassに位置し、どこかのjarファイルに含まれるであろう。あなたはまた、環境変数を経由してクラスパスを指定することができます

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

、に従ってください:任意の通常の複雑なJava用

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

あなたはjavac

例を使用する必要がコンパイルするための

あなたは、build.xmlという名前のアリスクリプトを探してください。

+1

コンパイルしようとしているJavaプログラムの名前がSnortMonitorの場合は、次のように変更します。 bash $ java -classpath path/to/jar/file SnortMonitor –

+1

'java'の代わりに' javac'を呼び出すことができますが、引き続き-classpathとソースディレクトリを使います。 – Petriborg

+0

あなたのお手伝いをお願いしますが、少し具体的にお願いしますか?たぶんそれは私の理解の欠如のためです。 「javac SnortMonitor.java」と書くと、エラーのリストが表示され、jsendnscaというディレクトリから2つのjarファイルをインクルードする必要があるため、そのエラーを知ることができます。プログラムをコンパイルして実行するたびに、それらのjarをクラスパスに含める必要がありますか? –

5

classpathは、アプリケーションが参照するクラスを見つけるためにJavaコンパイラ(コマンド:javac)とJVM(コマンド:java)が見える場所です。 アプリケーションが別のクラスを参照するのはどういう意味ですか?

例::それはそのコードのどこかで、そのクラスを使用することを意味し、簡単な言葉で

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

あなたがこの(のjavac)をコンパイルしようとコンパイラがAnotherClassクラスが必要になります。アプリケーションを実行しようとするときも同じです.JVMにはAnotherClassクラスが必要です。 このクラスを見つけるために、javacとJVMは特定の(セットの)場所を調べます。これらの場所はclasspathによって指定され、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上にあることを確認する必要があります:作業ディレクトリにあります(MyClass.java)のクラスをコンパイルする方法を見ることができます上記の例で

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 

とコンパイルされたクラスを実行します(現在のディレクトリを表すクラスパスの先頭に "。"があることに注意してください)。このディレクトリはクラスパスにも追加する必要があります。そうしないと、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のを編集し、最後にどこかにこの行を追加します。

しかし、クラスパスは頻繁に変更されるため、頻繁に必要となるクラスのコアセットにクラスパスを設定し、そのセッションだけ必要なときにクラスパスを拡張することができます。このように:

export CLASSPATH=$CLASSPATH:"new directories according to your current needs" 
+0

コンパイルして実行するたびにこれらのクラスパスを定義する必要がありますか? –

+0

私の答えを編集しました – Razvan

16

複数の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 
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)

関連する問題