[英]Difference between Rsrc-Class-Path and Class-Path
有人能告诉我 runnable-jar 的 mannifest 文件的Rsrc-class-Path
和Class-Path
部分有什么区别吗?
现在我认为它们是 Eclipse 生成的,但我想了解它是如何工作的。
根据 Eclipse 生成代码的方式,我认为第一个是我的应用程序需要的 jars,第二个总是.
. 但我不知道是什么文件夹.
指的是。
Class-Path
属性。 这是JAR 文件规范定义的标准属性。 它包含一个相对 URL 列表,当您使用java -jar...
运行 JAR 时,这些 URL 将包含在运行时类路径中。
这提供了一种将外部 JARs(和目录)添加到运行时类路径的方法。 条目必须是相对的,并且相对于包含主要 JAR 的目录进行解析。(出于安全原因...)
Rsrc-class-Path
属性是非标准的。 这是由 Eclipse 的“jars-in-jar”启动器使用的。 典型的清单如下所示:
Manifest-Version: 1.0
Rsrc-Main-Class: com.abc.Master
Main-Class: com.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
Rsrc-Class-Path: ./ lib/xyz.jar
其中com.abc.Master
是您的应用程序(真实)主要 class,而lib/xyz.jar
是嵌套在此 JAR 中的 JAR 文件的相对 URL 。 您还将看到 JAR 包含JarRsrcLoader
的“.class”文件。 这就是您运行java -jar this.JAR arg1 arg2
时发生的情况。
Main-Class
/ 给出的JarRsrcLoader
classmain
方法,传递给它["arg1", "arg2"]
JarRsrcLoader
检查清单,并提取Rsrc-Class-Path
和Rsrc-Main-Class
。JarRsrcLoader
创建一个特殊的类加载器,它知道如何读取嵌入在当前 JAR 中的 JARs。这个类加载器的类路径是“./”,后跟“lib/xyz.jar”,这些 URL在外部 JAR 文件中解析。JarRsrcLoader
使用特殊的 class 加载程序加载 class com.abc.Master
。JarRsrcLoader
调用 com.abc.Master 的main
方法,传递包含com.abc.Master
的相同字符串数组。 简而言之, Rsrc-Class-Path
是JarRsrcLoader
class 理解的一个属性,用于构建实际的应用程序类路径。
在这种情况下, Class-Path: .
属性没有实际用途。 运行JarRsrcLoader
所需的一切都在 JAR 中。
最后要注意的是,SpringBoot 的加载机制是类似的,但它对应用程序的主 class 使用不同的非标准属性,并将应用程序的资源(例如 JAR)放入特定目录(“/boot-inf”)中主 JAR。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.