Java如何决定在哪里查找主类?

时间:2013-03-21 07:06:03

标签: java classpath

我在一个名为“staged”的文件夹中有一堆.jar文件。

/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

Java正在寻找staged.akka-slf4j_2.10.0-RC1-2.1.0-RC1.jar中的主类。 NettyServer类位于一个名为play_2.10-2.1-RC1.jar的完全不同的.jar文件中。 Java如何确定要搜索哪些.jar文件以便找到主要方法?

5 个答案:

答案 0 :(得分:4)

Java不搜索特定的jar文件。它只是在结果类路径中搜索您在命令行中指定的类。

编辑:除非指定'-jar',否则它使用MANIFEST.MF文件的Main-Class指令。

答案 1 :(得分:1)

MANIFEST.MF中你必须写一个这样的一行:

Main-Class: MyPackage.MyClass

然后将这个Manifest添加到你的jar中,jar知道在哪里看。

答案 2 :(得分:1)

.jar中的MANIFEST.MF文件位于META-INF文件夹中。

如果它不存在,您可以创建一个新的。

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

答案 3 :(得分: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

答案 4 :(得分:0)

shell扩展了命令行

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是第一个参数,它搜索主类。