我编译了一个 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
ETC...
每个都给出一个错误说:
错误:无法找到或加载主类....
或给出 NoClassDefFoundError
指示未找到库。
我什至尝试重新制作 JAR 文件并包含 lib
目录和内容,但仍然没有骰子...
如何从命令行执行 JAR 文件并指定要使用的类路径?
当您指定 -jar
时,将忽略 -cp
参数。
使用此选项时,JAR 文件是所有用户类的来源,其他用户类路径设置将被忽略。
您也不能将所需的 jar 文件“包含”到另一个 jar 文件中(您需要提取它们的内容并将 .class 文件放入您的 jar 文件中)
你有两个选择:
将 lib 目录中的所有 jar 文件包含到清单中(您可以在那里使用相对路径) 使用 -cp 在命令行上指定所有内容(包括您的 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
是 JAR 中具有 main(String[])
方法的类的完全限定名称
jar 和依赖 jar 应该具有执行权限。
您可以在 unix shell 中执行这些操作:
java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main
您可以在 windows powershell 中执行以下操作:
java -cp "MyJar.jar;lib\*" com.somepackage.subpackage.Main
或者,如果您愿意,可以使用清单指定类路径和主类,这样就不需要使用 -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
您可以执行 Runtime.getRuntime.exec(command) 重新启动 jar,包括带有 args 的类路径。
unzip MyJar.jar lib/*.jar
。然后,按照您的建议,他们可以运行java -cp MyJar.jar:lib/* ...