民间,
早些时候,我只有一个jar文件,并设置了清单,以便我可以简单地运行我的程序:
java -jar MyApp.jar
现在,我已将我的功能分成两个jar文件 - MyCore.jar和MyApp.jar。
以下命令有效:
java -cp "*" com.mycompany.mypackage.App
但我无法让以下工作
java -cp "*" -jar MyApp.jar
我得到一个ClassNotFoundException。
我更喜欢使用" -jar"开关。有没有办法让它发挥作用?
提前感谢您的帮助。
的问候,
彼得
答案 0 :(得分:10)
根据Java cli documentation,您无法在同一命令中组合-cp和-jar
-jar执行封装在JAR存档中的程序。第一个参数是JAR文件的名称而不是启动类名称。为了使此选项起作用,清单 JAR文件必须包含Main-Class:classname形式的行。这里,classname标识具有public static void main(String [] args)方法的类,该方法充当应用程序的起点。有关使用Jar文件和Jar文件管理器的信息,请参阅Jar工具参考页面和Java Tutorial的Jar跟踪。 巨星汇。 使用此选项时,JAR文件是所有用户类的源,并忽略其他用户类路径设置。请注意,可以使用“java -jar”选项运行的JAR文件可以设置其执行权限,以便可以在不使用“java -jar”的情况下运行它们。请参阅Java Archive(JAR) 文件。
为了解决这个问题,您需要确保应用程序jar中的清单引用包含主文件的Class和类路径。
答案 1 :(得分:4)
我有一个像这样的Manifest.mf文件。
Manifest-Version: 1.0
Main-Class: com.mycompany.mypackage.App
Class-Path: MyApp.jar MyCore.jar log4j.jar
您可以将所需的任何jar文件添加到Class-Path行。然后,只要jar类在类路径中,就可以运行java -jar命令而不使用-cp。
答案 2 :(得分:4)
假设两个jar文件都在同一个文件夹中,com.mycompany.mypackage.App
是主应用程序类,请尝试以下命令:
java -cp MyCore.jar;MyApp.jar com.mycompany.mypackage.App
它应该适合你。
如果您坚持使用-jar
开关(为什么?),则需要修改清单文件,添加Class-Path
密钥并指定路径所有相关的jar文件。如果jar文件未与主app jar文件一起打包,它会使您的应用程序不那么灵活。
答案 3 :(得分:3)
添加一个清单,它既指定包含main()
的类,也指定类路径。有关详细信息,请参阅Working with Manifest Files: Adding Classes to the JAR File's Classpath。
然后整个应用程序。可以使用-jar
启动,无需-cp
。