从命令行运行一个 JAR 文件并指定类路径

我已经编译了一个 JAR文件,并在清单中指定了 Main-Class (我使用了 Eclipse出口函数)。我的依赖项都在标记为 lib的目录中。我似乎不能直接回答如何执行我的 JAR 文件,同时指定它应该使用 lib/*作为类路径。

我试过了:

]$ java -jar -cp .:lib/* MyJar.jar
]$ java -cp .:lib/* -jar MyJar.jar
]$ java -cp .:lib/* com.somepackage.subpackage.Main

等等。

每一个都给出一个错误说明:

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

或者给出 NoClassDefFoundError,表示找不到库。

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

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

279720 次浏览

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

来自 文件:

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

您也不能将所需的 jar 文件“包含”到另一个 jar 文件中(您需要提取它们的内容并将。类文件放到 jar 文件中)

你有两个选择:

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

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

java -cp <jar_name.jar:libs/*> com.test.App

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

libs/*是到依赖项 JAR 的路径

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

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

您可以在 unixshell 中完成以下操作:

java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main

你可以用 Windows PowerShell 来做这些:

java -cp "MyJar.jar;lib\*" com.somepackage.subpackage.Main

或者,如果愿意,可以使用清单指定 class-path 和 main-class,这样就不需要使用 -cp或指定 main 类。在你的例子中,它包含这样的行:

Main-Class: com.test.App
Class-Path: lib/one.jar lib/two.jar

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

那就用

java -jar MyJar.jar

您可以执行 Runtime.getRuntime.exec (命令)来重新启动 jar,包括带有 args 的类路径。