我在一个名为“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文件以便找到主要方法?
答案 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
是第一个参数,它搜索主类。