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


115

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

我试过了:

]$ 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文件并指定要使用的类路径?


Answers:


204

指定-jar后,该-cp参数将被忽略。

文档中

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

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

您有两种选择:

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

22
; 而不是:如果您按以下方式使用Windows,则java -cp MyJar.jar; lib / * com.somepackage.subpackage.Main
错误

您也不能将所需的jar文件“包含”到另一个jar文件中。你当然可以。如果是供内部使用(例如,您希望用户具有一定的技术技能等),则可以在运行jar之前要求执行步骤1 unzip MyJar.jar lib/*.jar。然后,按照您的建议,他们可以跑步java -cp MyJar.jar:lib/* ...
罗杰(Roger)

3
令人讨厌的是,它是运行“全包” uber jar的常见用例,并引用了特定于外部服务器的属性文件。显然,它不是一个阻止程序,但是如果您可以使用-jar而不需要指定主命令,那么它肯定是一个较为冗长的命令
Andrew Norman

花了我一段时间找出答案。并花费大约6行来显式加载log4j文件。另一个永远无法修复的Java错误。
调谐的

1
注意,清单类路径只能用于加载jar文件。例如,它不能用于查找log4j3.xml。给我很好。
调谐的

34

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

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

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

libs/* 是依赖JAR的路径

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

jar和从属jar应该具有执行权限。


10

您可以在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之外的配置文件。
调谐的

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.