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

时间:2012-10-24 09:11:52

标签: java 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 class's Javadoc,JDK代码发现这两条路径彼此不相关。

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

2 个答案:

答案 0 :(得分:7)

我也对此感到有点生气。答案是没有对JAR文件的语义做了什么 - 它与jar: URI的语法有关。要进行“相对化”,URI必须是分层且不透明。您将从JavaDoc for java.net.URI中注意到:

  

在最高级别,字符串形式的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://部分是 层次结构的嵌套URI。

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

  

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

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

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

答案 1 :(得分:-1)

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协议并不存在基础文档/目录,例如/conf

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

没有基础文档(.html)和相关文档(.js)。


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