繁体   English   中英

如果 MANIFEST.MF 不存在,什么定义了主要的 class

[英]What defines the main class if MANIFEST.MF is not present

在 Eclipse 中导出到 JAR 时有两个选项:导出为可运行 JAR 和导出为 Z31709E64AAEC8C25ABF633

我了解可运行的 jar 包含一个 MANIFEST.MF 文件,该文件定义了在执行 jar 时要执行的主 class。

我也了解不可运行的 jars 只是类库,可以将其添加到类路径中以便重用代码。 它包含一个清单文件,但其中没有定义的主 class。

如果主 class 未定义,如何执行不可运行的 JAR 文件? 拥有定义主要 class 的 MANIFEST.MF 文件的优点/缺点是什么? 一个比另一个更稳定吗?

如果 MANIFEST.MF 不存在,什么定义了主要的 class

如果 JAR 文件没有“META-INF/MANIFEST.MF”组件,则它不是 JAR 文件 它只是一个 ZIP 文件,您不能将java -jar...与 ZIP 文件一起使用。 (您可以在类路径中包含 ZIP 文件,但通常不会这样做。)

如果 JAR 文件的 MANIFEST.MF 没有Main-Class属性,则不是可执行的 JAR 文件,并且java -jar...

但是(如前所述)许多 JAR 文件是库而不是应用程序。 对他们来说,入口点 class 没有任何意义。


如果主 class 未定义,如何执行不可运行的 JAR 文件?

(首选的 Java 术语是“可执行的”而不是“可运行的”。)

在这种情况下, java -jar...将失败。 相反,您可以像这样运行应用程序:

  java -cp <classpath> <other-options> com.example.MyApp.Main <args>

其中com.example.MyApp.Main是主/入口点 class, <classpath>包括 JAR(或 ZIP)文件和任何其他运行时依赖项。

请注意,应用程序 JAR 文件可能包含多个入口点 class,用户可以决定使用哪一个。


拥有定义主要 class 的 MANIFEST.MF 文件的优点/缺点是什么?

首先,如果您使用jar命令创建 JAR 文件,那么它将有一个 MANIFEST.MF 该命令不会创建没有一个 JAR。

此外,您还可以在 MANIFEST.MF 中包含其他有用的内容。 其中包括数字哈希(用于签名的 JAR)和一个Class-Path属性,用于在使用-jar启动 JAR 时使用。 有关详细信息,请参阅JAR 文件规范

在 JAR 文件中具有Main-Class属性的优点是:

  1. 如果您想使用-jar ,这是必要的。
  2. 这意味着用户不需要知道(或输入)入口点 class 的全名。

拥有Main-Class属性没有明显的缺点。 如果用户不使用java -jar...启动方法,则任何此类属性都将被忽略。 但我想你可能会说在JAR 上放置一个无意义的Main-Class属性可能会导致天真的用户得到误导性错误。 这是毛骨悚然...


一个比另一个更稳定吗?

不是直接的。

您可能会争辩说,使用-jar更稳定,因为可执行文件 JAR 会忽略CLASSPATH环境变量和命令行上的-cp arguments。 但另一方面是您不能强制用户使用-jar (或双击)来启动命令。 您可以通过提供 shell 脚本或 BAT 文件来使用适当的入口点 class 名称和适当的类路径来启动应用程序,从而获得类似的稳定性。


我在没有类路径或项目文件的情况下在 Eclipse 中执行了一个不可运行的 jar,然后我运行它并运行它。 它能够识别主要的 class 并从那里运行它。 我的问题是:它是如何识别它的?

好的......这是一个不同的问题。

这里实际发生的是 Eclipse 项目有一堆配置信息,其中包括构建依赖项。 这些为 Eclipse 启动器提供了默认类路径。 然后,当您在没有现有运行配置的情况下使用 Eclipse 的run命令时,Eclipse 将搜索当前项目中的所有类,以查找任何具有public static void main(String[])方法的类。 如果它只找到一个这样的 class,它假定它是入口点 class,并为项目 / class 创建一个运行配置。 启动该配置时, Eclipse 等效于java -cp <classpath> <class-name> <args>

笔记:

  1. 这是Eclipse 特定行为 标准的 Java 工具链不会做这样的事情。

  2. Eclipse 未在此处使用java -jar ,因此不会参考清单来查找入口点 class。

  3. 众所周知,这会破裂。 例如,我听说如果您删除主 class 并创建一个新的,启动配置不会更新,并且当您尝试“运行”它时它会给出 JVM 启动错误。

A "runnable jar" is a jar file where the manifest file contains instructions allowing the java Java runner command to "run" the jar file in a simpler way.

Eg if a Foo.jar file has a static void main(String[]) method in a class Bar in package com.example , then you can run the program using:

java -cp Foo.jar com.example.Bar

如果 jar 文件清单文件包含以下行:

Main-Class: com.example.Bar

然后您可以以更简单的方式运行 jar 文件:

java -jar Foo.jar

当然,如果没有带有main()方法的 class,那么 jar 文件中的代码不是“可运行的”,因此只是一个库文件。

这就是它的全部。

有关更多信息,请参见例如Java™ 教程 - 设置应用程序的入口点

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM