9

早些时候,我只有一个 jar 文件,并且设置了清单,以便我可以简单地运行我的程序:

 java -jar MyApp.jar

现在,我已将我的功能分成两个 jar 文件 - MyCore.jar 和 MyApp.jar。

以下命令有效:

java -cp "*" com.mycompany.mypackage.App

但我无法让以下工作

java -cp "*" -jar MyApp.jar

我得到一个 ClassNotFoundException。

我更喜欢使用“-jar”开关。有没有办法让它工作?

4

4 回答 4

11

根据 Java cli文档,您不能在同一命令中组合 -cp 和 -jar

-jar 执行封装在 JAR 档案中的程序。第一个参数是 JAR 文件的名称,而不是启动类名称。为了使该选项起作用,JAR 文件的清单必须包含格式为 Main-Class:classname 的行。在这里,classname 标识具有用作应用程序起点的 public static void main(String[] args) 方法的类。有关使用 Jar 文件和 Jar 文件清单的信息,请参阅 Jar 工具参考页面和 Java 教程的 Jar 跟踪。使用此选项时,JAR 文件是所有用户类的来源,其他用户类路径设置将被忽略。请注意,可以使用“java -jar”选项运行的 JAR 文件可以设置其执行权限,这样它们就可以在不使用“

为了解决这个问题,您需要确保应用程序 jar 中的清单引用包含主文件的类和类路径。

于 2012-08-21T02:43:38.080 回答
6

我有一个像这样的 Manifest.mf 文件。

Manifest-Version: 1.0
Main-Class: com.mycompany.mypackage.App
Class-Path: MyApp.jar MyCore.jar log4j.jar 

您可以将所需的任何 jar 文件添加到 Class-Path 行。然后只要 jar 在类路径中,您就可以在没有 -cp 的情况下运行 java -jar 命令。

于 2012-08-21T02:43:31.820 回答
5

假设两个 jar 文件都在同一个文件夹中并且com.mycompany.mypackage.App是主应用程序类,请尝试以下命令:

java -cp MyCore.jar;MyApp.jar com.mycompany.mypackage.App

它应该适合你。

如果您坚持使用-jar开关(为什么?),那么您需要修改清单文件,添加Class-Path密钥并指定所有相关 jar 文件的路径。如果 jar 文件未与您的主应用程序 jar 文件打包,它会使您的应用程序不太灵活。

于 2012-08-21T05:15:04.223 回答
3

添加一个既指定包含的类又指定main()类路径的清单。有关更多详细信息,请参阅使用清单文件:将类添加到 JAR 文件的类路径

然后是整个应用程序。可以使用 启动-jar,而不需要-cp.

于 2012-08-21T02:40:27.497 回答