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

Posted

技术标签:

【中文标题】从命令行运行 JAR 文件并指定类路径【英文标题】:Run a JAR file from the command line and specify classpath 【发布时间】:2013-08-27 02:32:59 【问题描述】:

我编译了一个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

等等……

每个都给出一个错误说:

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

或提供NoClassDefFoundError 表示未找到库。

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

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

【问题讨论】:

Execute jar file with multiple classpath libraries from command prompt的可能重复 【参考方案1】:

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

来自the documentation:

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

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

你有两个选择:

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

【讨论】:

;而不是:如果你使用windows如下 java -cp MyJar.jar;lib/* com.somepackage.subpackage.Main 您也不能将所需的 jar 文件“包含”到另一个 jar 文件中。 当然可以。如果它是供内部使用的(即,您希望用户具有一些技术技能等),您可以在尝试运行 jar 之前询问第 1 步是否运行 unzip MyJar.jar lib/*.jar。然后,按照您的建议,他们可以运行 java -cp MyJar.jar:lib/* ... 令人遗憾的是,它是一个常见的用例来运行“全包”超级 jar 并引用外部服务器特定的属性文件。显然不是一个阻止程序,但如果您可以使用 -jar 并且不必指定 main,那么肯定是一个不那么冗长的命令 我花了一段时间才弄明白。并且需要大约 6 行来显式加载 log4j 文件。另一个永远无法修复的 Java 错误。 请注意,清单类路径只能用于加载 jar 文件。例如,它不能用于查找 log4j3.xml。对我有好处。【参考方案2】:

运行一个 jar 文件并像这样指定一个类路径:

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

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

libs/* 是您的依赖 JAR 的路径

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

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

【讨论】:

sometimes " 需要在类路径周围。例如, 在我的 Mac 中不起作用,而 工作。有什么想法,为什么?【参考方案3】:

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

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

您可以在 windows powershell 中执行这些操作:

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

我认为 Class-Path 需要引用外部 jar 中的文件。我无法让它正常工作,以引用 MyJar.jar 之外的配置文件。【参考方案5】:

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

【讨论】:

以上是关于从命令行运行 JAR 文件并指定类路径的主要内容,如果未能解决你的问题,请参考以下文章

在命令行上将多个 jar 添加到类路径 [重复]

Spring Boot 在命令行指定主类启动程序

windows下用命令行编译并运行java工程,怎样编译引用的多个jar包和配置文件.xml呢?

hadoop——在命令行下编译并运行map-reduce程序 2

jar包命令行密码参数

为啥 WEKA 不从命令行运行?