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

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

  • 文件夹URI

    jar:file:/C:/Users/inagy/.m2/repository/hu/inagy/my-config-artifact/2.0-SNAPSHOT/my-config-artifact-2.0-SNAPSHOT.jar!/conf/ 
  • 资源URI

     jar:file:/C:/Users/inagy/.m2/repository/hu/inagy/my-config-artifact/2.0-SNAPSHOT/my-config-artifact-2.0-SNAPSHOT.jar!/conf/somesubpath/someconfig.xml 
  • 在调用folderUri.relativize(resourceURI)我希望得到以下URI:

     somesubpath/someconfig.xml 

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

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

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

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

 [scheme:]scheme-specific-part[#fragment] 

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

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

 [scheme:][//authority][path][?query][#fragment] 

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

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

由于特定于方案的部分不以“ / ”开头,因此不能将其视为分层URI。 URI类不会特别处理jar:或任何)URI,因此无法识别file:// part是一个分层的嵌套URI。

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

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

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

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

somesubpath/someconfig.xml不是URI; 协议(如file: :)缺失。 实际上只有一个带jar:file:/C:/Users/inagy/.m2/repository/hu/inagy/my-config-artifact/2.0-SNAPSHOT/my-config-artifact-2.0-SNAPSHOT.jar!somesubpath/someconfig.xml的完整URL jar:file:/C:/Users/inagy/.m2/repository/hu/inagy/my-config-artifact/2.0-SNAPSHOT/my-config-artifact-2.0-SNAPSHOT.jar!somesubpath/someconfig.xml是可以想象的,但是jar协议不存在基础文档/目录,比如/conf

所以你只能使用绝对路径。 URI代表唯一资源标识符的结果。

没有带有相关文档(.js)的基本文档(.html)。


URI是检索数据。 如何为jar中的文件写一个相对URI? 相对于哪里? 由于“jar:”协议仅在java代码中使用,因此没有“当前文件”的上下文。 所以没有实现相对URI。