何时检查和使用 Jar 文件中的 Class-Path 属性
我有一个学术问题,但在 Sun/Oracle 中找不到相应的文档。
我有一组 Jar 文件,并且 java vm 是这样启动的:
java -cp one.jar:two.jar:helper.jar my.company.project.Main
如您所见,我不使用 -jar 选项,而是提供一个类路径。 helper.jar 只有一个清单文件,定义了包含所需的其余 jar 文件的类路径。
由于我没有使用 -jar 命令行选项,我想知道是否评估并使用了该清单类路径。 (是的,我知道 -jar 的作用,我知道 Main-Class 的用途,并且我知道如何将类路径与 -jar 结合使用。我只不知道它是否不使用使用-jar)
或者澄清我的问题:它工作可靠吗并且在官方Sun/Oracle文档中记录在案?
谢谢
I have an academic question for which I don't find the appropriated documentatino from Sun/Oracle.
I have a set of Jar files and the java vm is started like this:
java -cp one.jar:two.jar:helper.jar my.company.project.Main
As you can see I don't use the -jar option but give a classpath.
The helper.jar only has a manifest file defining a Class-Path containing the remaining jar files that are needed.
As I'm not using the -jar command line option I'm wondering if that manifest Class-Path is evaluated and used. (Yes, I know what -jar does, I know what Main-Class is for and I know how to use the Class-Path in conjunction with -jar. I only don't know if it works without using -jar)
Or to clarify my question: does it work reliable and is somewhere documented in an official Sun/Oracle document?
Thank you
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
当从 JAR 加载类时,JAR 文件清单中的类路径条目始终用于扩展类路径。无论您是否使用
-jar
开关,都没有什么区别。事实上,我对这种行为感到惊讶,但它可以通过使用两个类 A 和 B 的简单示例轻松重现。让 A 引用 B。将每个类放入其自己的 JAR 文件中。将清单添加到 A.jar,其中包含
Class-Path: B.jar
。那么以下命令将正确解析B:java -cp A.jar A
。此处也对此进行了描述 Java 启动器如何查找 JAR-class-path类部分Java启动器如何查找JAR-class-path类。
The class-path entry from a JAR file's manifest is always used to extend the classpath when loading classes from that JAR. It does not make a difference if you use the
-jar
switch or not.I was in fact surprised about this behavior, but it is easily reproduced with a simple example using two classes A and B. Let A reference B. Put each class in its own JAR file. Add a manifest to A.jar that includes
Class-Path: B.jar
. Then the following command will correctly resolve B:java -cp A.jar A
.This is also described here How the Java Launcher Finds JAR-class-path Classes section How the Java Launcher Finds JAR-class-path Classes.