java.net.URI.relativize不适用于JAR URI

Nag*_*gyI 5 java uri

我有两个URI对象.一个指向JAR文件中的文件夹,另一个指向同一JAR文件中的文件.该文件位于第一个URI指定的目录的子文件夹中.我喜欢创建一个相对URI,因此生成的URI只包含JAR中文件的相对路径.

但是我得到了resourceURI,这意味着根据URI类的Javadoc,JDK代码发现这两条路径彼此不相对.

这是一个错误还是我做错了什么?

Tim*_*tes 7

我也对此感到有点恼火.答案与JAR文件的语义无关 - 它与jar:URI 的语法有关.要"相对化",URI必须是分层的而不是不透明的.您将从JavaDoc for java.net.URI中注意到:

在最高级别,字符串形式的URI引用(下文中简称为"URI")具有语法

[scheme:]scheme-specific-part[#fragment]
Run Code Online (Sandbox Code Playgroud)

...

不透明URI是绝对URI,其特定于节点的部分不以斜杠字符('/')开头.不透明的URI不需要进一步解析.

...

分层URI根据语法进行进一步解析

[scheme:][//authority][path][?query][#fragment]
Run Code Online (Sandbox Code Playgroud)

像JAR URI一样jar:file:///home/me/foo.jar!/conf/被解析为:

  • scheme = jar
  • scheme-specific-part = file:///home/me/foo.jar!/conf/
  • fragment =(none)

由于特定于方案的部分不以" /," 开头,因此不能将其视为分层URI.URI类不会jar:特别处理(或任何)URI,因此无法识别该file://部分分层的嵌套URI .

由于jar:URI是不透明的而不是分层的,因此它们受URI#relativize()记录的行为的影响:

给定URI对此URI的相对化计算如下:

  1. 如果此URI或给定URI是不透明的,[...],则返回给定的URI.

编辑:遗漏了关于不透明URI的关键部分.