2013-03-21 217 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第一个参数,它搜索的主类。