2013-03-21 79 views
4

我在名爲「staged」的文件夾中有一堆.jar文件。Java如何決定在哪裏尋找主類?

/target 
    /staged 
    - akka-slf4j_2.10.0-RC1-2.1.0-RC1.jar 
    - play_2.10-2.1-RC1.jar 
    - etc... 

雖然我的當前目錄爲「目標」,我嘗試運行命令

$ java -cp ./staged/* play.core.server.NettyServer ./.. 
Error: Could not find or load main class ..staged.akka-slf4j_2.10.0-RC1-2.1.0-RC1.jar 

這bizzarre Java是否尋找staged.akka-slf4j_2.10.0-RC1-一個主類2.1.0-RC1.jar。 NettyServer類位於名爲play_2.10-2.1-RC1.jar的完全不同的.jar文件中。 Java如何決定搜索哪些.jar文件以找到主要方法?

回答

1

您收到此錯誤,因爲類路徑中應該包含的條目用冒號分隔:,而不是空白。當shell擴展target/*時,它會在每個文件之間放置空格,這使得java只能「認爲」第一個jar文件在類路徑中,第二個jar文件是要運行的類的名稱,其餘部分是命令行參數應傳遞給main

如果引用路徑,java擴展*以正確的分隔符的文件列表:

java -cp "./staged/*" play.core.server.NettyServer ./.. 

又見other ways to create a classpath from all the files in a directory in this question

+0

我嘗試了引號,並得到了相同的錯誤! – Mark 2013-03-21 16:04:38

+0

完全相同的錯誤,或稍有不同的錯誤? – Joni 2013-03-21 16:58:43

+0

@Mark,如果你的java命令的版本沒有在類路徑中擴展*,還有很多其他方法來計算它。 (見編輯) – Joni 2013-03-21 17:14:06

1

MANIFEST.MF你必須寫這樣一行:

Main-Class: MyPackage.MyClass 

然後添加此清單到您的罐子,罐子知道去哪裏找。

+0

請注意,只有在使用'-jar'選項運行Java程序(運行可執行JAR)時纔會使用此選項。 – Jesper 2013-03-21 07:14:39

4

Java不搜索特定的jar文件。它只是在結果類路徑中搜索您在命令行中指定的類。

編輯:除非您指定'-jar',在這種情況下它使用MANIFEST.MF文件的Main-Class指令。

1

在放置在META-INF文件夾中的.jar中有MANIFEST.MF文件。

如果不存在,您可以創建一個新的。

http://docs.oracle.com/javase/tutorial/deployment/jar/defman.html

示例內容:

Manifest-Version: 1.0 
Created-By: 1.7.0_06 (Oracle Corporation) 
Main-Class: org.package.MainClass 
+0

請注意,只有在使用'-jar'選項運行Java程序(運行可執行JAR)時纔會使用此選項。 – Jesper 2013-03-21 07:14:11

0

外殼擴展您的命令行

java -cp ./staged/* play.core.server.NettyServer ./.. 

例如以

java -cp ./staged/play_2.10-2.1-RC1.jar ./staged/akka-slf4j_2.10.0-RC1-2.1.0-RC1.jar ... play.core.server.NettyServer ./.. 

現在,Java具有./staged/play_2.10-2.1-RC1.jar的類路徑和./staged/akka-slf4j_2.10.0-RC1-2.1.0-RC1.jar第一個參數,它搜索的主類。