我有两个 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,这意味着根据Java URI 类 http://docs.oracle.com/javase/1.5.0/docs/api/java/net/URI.html#relativize%28java.net.URI%29JDK 代码发现这两个路径彼此不相关。
这是一个错误还是我做错了什么?
我也曾对此感到有点恼火。答案有nothing与 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 URI 类似jar:file:///home/me/foo.jar!/conf/
被解析为:
- 方案=
jar
- 方案特定部分 =
file:///home/me/foo.jar!/conf/
- 片段=(无)
因为方案特定部分不以“开头/
,”它不能被视为分层 URI。URI 类不处理jar:
(或任何)特殊的 URI,因此它无法识别file://
部分是一个嵌套的 URIis分层的。
Since jar:
URI 是不透明的并且没有层次结构,它们受记录的行为的约束URI#relativize() http://docs.oracle.com/javase/6/docs/api/java/net/URI.html#relativize%28java.net.URI%29:
给定 URI 相对于此 URI 的相对化计算如下
如下:
- 如果此 URI 或给定 URI 不透明,[...],则返回给定 URI。
EDIT:遗漏了关于不透明 URI 的关键部分。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)