2012-07-12 225 views
11

好吧,我對linux和命令行非常陌生,而且對於java來說還是比較新的。我有一個建立java程序的實習。我終於在我的機器上完成了它(Windows),現在我必須將它遷移到Linux機器上進行測試,然後將它作爲可執行文件運行。我已經在linux上做了大量的閱讀和研究,並且理解了classpaths,但它仍然很難完全理解。這只是沒有點擊我。任何人都可以使用示例以簡化的方式解釋類路徑的目的嗎?其中一個最令人困惑的方面是實際上定義了罐子的物理路徑。我是從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 2017-10-04 11:50:28

回答

10

您使用-classpath參數。您可以使用相對路徑或絕對路徑。這意味着您可以使用相對於當前目錄的路徑,或者可以使用從根/開始的絕對路徑。

實施例:

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的螞蟻腳本

+1

因此,如果我正在編譯的java程序被命名爲SnortMonitor,那麼你的示例會更改爲: bash $ java -classpath path/to/jar/file SnortMonitor – 2012-07-12 20:22:34

+1

編譯你需要啊調用'javac'而不是'java',但仍然使用-classpath和源目錄。 – Petriborg 2012-07-12 20:24:19

+0

謝謝你的幫助,但可以請你更具體一點嗎?也許這是因爲我缺乏理解。當我編寫「javac SnortMonitor.java」時,我得到一個錯誤列表,我知道它是因爲我需要從一個名爲jsendnsca的目錄中包含2個jar文件。每次編譯和運行程序時,是否需要將這些jar包含在classpath中? – 2012-07-12 20:30:49

5

classpath是java編譯器(command:javac)和JVM(命令:java)查找的位置,以查找應用程序引用的類。 應用程序引用另一個類是什麼意思?在簡單的話就意味着某個地方使用這個類在其代碼:

例子:

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

當您嘗試進行編譯器(javac)編譯器將需要AnotherClass類。當您嘗試運行您的應用程序時也是如此:JVM將需要AnotherClass類。 爲了找到這個類,javac和JVM在一個特定的(一組)地方查找。這些地方是由類路徑指定的,它在linux上是一個以冒號分隔的目錄列表(javac/JVM在需要時用來查找AnotherClass的目錄)。

所以爲了編譯你的類然後運行它,你應該確保classpath包含包含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中和在某處末尾添加該線;

但是,類路徑會經常發生變化,因此您可能希望將類路徑設置爲您需要經常使用的核心dirs集,然後每次只需要該會話時擴展該類路徑。像這樣:

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

每次我想編譯並運行時,我必須定義這些類路徑嗎? – 2012-07-12 20:23:23

+0

我編輯了我的答案 – Razvan 2012-07-12 20:41:31

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 

這些步驟之後,直接complile並運行您的程序(例如, javac xyz.java)

相關問題