繁体   English   中英

Rsrc-Class-Path 和 Class-Path 的区别

[英]Difference between Rsrc-Class-Path and Class-Path

有人能告诉我 runnable-jar 的 mannifest 文件的Rsrc-class-PathClass-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时发生的情况。

  1. JVM 被创建
  2. JVM jar loader打开JAR,读取并解析上面的MANIFEST.MF。
  3. 它加载Main-Class / 给出的JarRsrcLoader class
  4. 它调用上面类的main方法,传递给它["arg1", "arg2"]
  5. JarRsrcLoader检查清单,并提取Rsrc-Class-PathRsrc-Main-Class
  6. 然后JarRsrcLoader创建一个特殊的类加载器,它知道如何读取嵌入在当前 JAR 中的 JARs。这个类加载器的类路径是“./”,后跟“lib/xyz.jar”,这些 URL外部 JAR 文件中解析。
  7. 然后JarRsrcLoader使用特殊的 class 加载程序加载 class com.abc.Master
  8. 然后JarRsrcLoader调用 com.abc.Master 的main方法,传递包含com.abc.Master的相同字符串数组。
  9. 最后,应用程序运行。

简而言之, Rsrc-Class-PathJarRsrcLoader class 理解的一个属性,用于构建实际的应用程序类路径。

在这种情况下, Class-Path: . 属性没有实际用途。 运行JarRsrcLoader所需的一切都在 JAR 中。


最后要注意的是,SpringBoot 的加载机制是类似的,但它对应用程序的主 class 使用不同的非标准属性,并将应用程序的资源(例如 JAR)放入特定目录(“/boot-inf”)中主 JAR。

暂无
暂无

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

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