从命令行运行JAR文件并指定classpath

Sna*_*Doc 107 java shell command-line classpath

我编译了一个JAR文件并在清单中指定了Main-Class(我使用了Eclipse Export函数).我的依赖项都在标记的目录中lib.我似乎无法得到关于如何执行我的JAR文件的直接答案,同时指定它应该使用lib/*作为类路径.

我试过了:

]$ java -jar -cp .:lib/* MyJar.jar
]$ java -cp .:lib/* -jar MyJar.jar
]$ java -cp .:lib/* com.somepackage.subpackage.Main
Run Code Online (Sandbox Code Playgroud)

等等...

每个都给出一个错误说:

Error: Could not find or load main class ....

或者NoClassDefFoundError表示没有找到库.

我甚至尝试重新制作JAR文件并包含lib目录和内容,但仍然没有骰子......

如何从命令行执行JAR文件并指定要使用的类路径?

a_h*_*ame 187

指定时-jar,-cp将忽略该参数.

文档:

使用此选项时,JAR文件是所有用户类的源,并忽略其他用户类路径设置.

您也不能将所需的jar文件"包含"到另一个jar文件中(您需要提取其内容并将.class文件放入您的jar文件中)

您有两种选择:

  1. lib目录中的所有jar文件包含到清单中(可以使用相对路径)
  2. 使用以下命令在命令行上指定所有内容(包括 jar)-cp:
    java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main

  • ; 而不是:如果你使用windows如下java -cp MyJar.jar; lib/*com.somepackage.subpackage.Main (19认同)
  • 请注意,清单类路径只能用于加载 jar 文件。例如,它不能用于查找 log4j3.xml。对我很好。 (3认同)
  • 令人讨厌的是,它是运行“全包” uber jar的常见用例,并引用了特定于外部服务器的属性文件。显然不是阻塞程序,但是如果您可以使用-jar而不必指定main,那么肯定是较为冗长的命令 (2认同)

Sid*_*Sid 31

运行jar文件并指定类路径,如下所示:

java -cp <jar_name.jar:libs/*> com.test.App
Run Code Online (Sandbox Code Playgroud)

jar_name.jar 是要执行的JAR的全名

libs/* 是依赖JAR的路径

com.test.App是具有该main(String[])方法的JAR中类的完全限定名称

jar和依赖jar应该具有执行权限.


小智 8

您可以在unix shell中执行以下操作:

java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main
Run Code Online (Sandbox Code Playgroud)

您可以在Windows powershell中执行以下操作:

java -cp "MyJar.jar;lib\*" com.somepackage.subpackage.Main
Run Code Online (Sandbox Code Playgroud)


Han*_*kCa 5

或者,如果您愿意,可以使用清单指定类路径和主类,这样您就不需要使用-cp或指定主类。在您的情况下,它将包含这样的行:

Main-Class: com.test.App
Class-Path: lib/one.jar lib/two.jar
Run Code Online (Sandbox Code Playgroud)

不幸的是,您需要在清单中拼出每个 jar(不是一个大问题,因为您只做一次,您可以使用脚本来构建文件或使用构建工具,如 ANT、Maven 或 Gradle)。并且引用必须是您运行java -jar MyJar.jar.

然后执行它

java -jar MyJar.jar
Run Code Online (Sandbox Code Playgroud)