[英]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
属性的优点是:
-jar
,这是必要的。 拥有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>
。
笔记:
这是Eclipse 特定行为。 标准的 Java 工具链不会做这样的事情。
Eclipse 未在此处使用java -jar
,因此不会参考清单来查找入口点 class。
众所周知,这会破裂。 例如,我听说如果您删除主 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.