5

我有两个 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代码发现这两个路径彼此不相关。

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

4

2 回答 2

9

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

在最高级别,字符串形式的 URI 引用(以下简称“URI”)具有以下语法

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

...

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

...

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

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

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

  • 方案 =jar
  • 方案特定部分 =file:///home/me/foo.jar!/conf/
  • 片段=(无)

因为方案特定部分不以“ /,”开头,所以不能将其视为分层 URI。URI 类不jar:专门处理(或任何)URI,因此它无法识别该部分分层file://的嵌套 URI 。

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

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

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

编辑:省略了关于不透明 URI 的关键部分。

于 2013-01-15T22:38:27.893 回答
-1

somesubpath/someconfig.xml不是 URI;缺少协议(如file:)。事实上,只有一个完整的 URLjar: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。

于 2012-10-24T09:20:15.477 回答