2017-10-10 86 views
2

我剛剛從IDE切換回記事本來編寫Java程序。該計劃正在使用20個JAR。我編譯成功。當我決定運行Java類文件時使用運行Java命令,包括當前文件夾中的所有JAR

java -cp ".\\*" MyProgram 

它給出標準錯誤「無法找到或加載主類....」。

我很困惑,因爲當我用現有文件夾中的所有文件運行java命令時,它只會獲得這些JAR,因爲當前文件夾已經在類路徑中。當程序從當前文件夾運行時,我嘗試使用-cp "."將它明確地包含在類路徑中,但這也不起作用。

最後我能夠用這個命令運行程序:

java -cp ".\\*;." MyProgram.java 

我問這個問題,瞭解背後的Java的類路徑中的實際邏輯。

糾正我,如果我錯了,但我認爲JAR只是一個標準的歸檔,其中所有的軟件包都封裝在各自的文件夾中。

java -cp "." MyProgram 

或者乾脆:如果所有的JAR文件都在我的當前文件夾包括我的主類文件,那麼爲什麼我不能與運行

java MyProgram 

如果問題是與多個JAR文件包括這就是爲什麼我們使用".\\*"包括在類路徑中的所有JAR文件,那麼爲什麼我們要明確在classpath中再次使用包含在當前文件夾:

java ".\\*;." MyProgram 
+0

http://docs.oracle.com/javase/8/docs/technotes/tools/windows/classpath.html。請參見「類路徑通配符」一節。 Quote:「類路徑條目可以包含基本名稱通配符('*'),這被認爲是相當於指定擴展名爲.jar或.JAR的目錄中所有文件的列表。例如,類路徑entry'mydir/*'指定名爲mydir的目錄中的所有JAR文件,由'*'組成的類路徑條目展開爲當前目錄中所有jar文件的列表。所以你真的只需要'cp'* ;.「' –

回答

0

你已經回答了你自己的問題,有點。

.表示它將在當前目錄中查找.class文件。

JAR的行爲就像一個目錄。所以要擁有abc.jar「目錄」,你需要在你的類路徑中指定。

如果你需要同時出現在當前目錄下的.class文件和.class文件打包到當前目錄中的JAR文件,您將有以下類路徑:-cp ".:*.jar

這裏所有的答案都告訴你使用沒有擴展名的通配符(*./*),但這是一種不好的做法,您不希望Java查看不相關的文件,因此請指定擴展名:*.jar

+0

不,正確的語法確實是'。\ *'(或Unix中的'./*',或者更好的是'*')。請參閱Oracle文檔:「類路徑條目可以包含基本名稱通配符('*'),它被認爲等同於指定擴展名爲.jar或.JAR的目錄中的所有文件的列表。例如,類路徑條目'mydir/*'指定名爲mydir的目錄中的所有JAR文件,包含'*'的類路徑條目展開爲當前目錄中所有jar文件的列表。 http://docs.oracle.com/javase/8/docs/technotes/tools/windows/classpath.html –

1

類拍h是包含程序的類和資源的jar文件和目錄的列表。提到一個jar文件將其內容添加到類路徑中。

"./*"只會得到當前目錄下的jar文件,"."會將當前目錄添加到類路徑中。這允許訪問所有類(以及jar文件作爲原始文件資源,但不包括其內容,即包含在其中的類)。

如果您在類路徑中同時需要,則必須同時指定兩者。

0

"."意味着當前目錄不在目錄

"./*"文件是指在當前目錄下的所有文件。

所以要使用在當前目錄中,以便第二個所有罐子將工作

1

要包含在命令提示符下使用通配符*運行程序所需的所有jar:

java -classpath E:\lib\* HelloWorld 

您正在使用「 「。定義當前目錄和「./*」定義當前目錄中的所有文件。