簡體   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