4

我在一个名为“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 文件以找到 main 方法?

4

5 回答 5

4

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

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

于 2013-03-21T07:08:30.490 回答
2

您收到此错误是因为类路径应包含由冒号分隔的条目:,而不是空格。当 shell 展开target/*时,它会在每个文件之间放置空格,这使得 java “认为”只有第一个 jar 文件在类路径中,第二个 jar 文件是您要运行的类的名称,其余的是命令应该传递给的行参数main

如果引用路径,则将 java* 扩展为具有正确分隔符的文件列表:

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

另请参阅此问题中从目录中的所有文件创建类路径的其他方法

于 2013-03-21T07:16:47.953 回答
1

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

Main-Class: MyPackage.MyClass

然后把这个 Manifest 添加到你的 jar 中,jar 就知道去哪里找了。

于 2013-03-21T07:08:11.927 回答
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
于 2013-03-21T07:08:31.103 回答
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第一个参数,它在其中搜索主类。

于 2013-03-21T07:21:09.500 回答