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

时间:2013-08-23 22:50:20

标签: 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

等...

每个人都会说错误:

  

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

或给出NoClassDefFoundError表示未找到库。

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

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

5 个答案:

答案 0 :(得分:169)

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

来自the documentation

  

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

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

您有两种选择:

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

答案 1 :(得分:29)

运行jar文件并指定类路径:

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

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

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

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

jar和相关jar应具有执行权限。

答案 2 :(得分:4)

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

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

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

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

答案 3 :(得分: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

答案 4 :(得分:0)

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