我有两个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/
Run Code Online (Sandbox Code Playgroud)资源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
Run Code Online (Sandbox Code Playgroud)在调用之后,folderUri.relativize(resourceURI)我希望得到以下URI:
somesubpath/someconfig.xml
Run Code Online (Sandbox Code Playgroud)但是我得到了resourceURI,这意味着根据URI类的Javadoc,JDK代码发现这两条路径彼此不相对.
这是一个错误还是我做错了什么?
我也对此感到有点恼火.答案与JAR文件的语义无关 - 它与jar:URI 的语法有关.要"相对化",URI必须是分层的而不是不透明的.您将从JavaDoc for java.net.URI中注意到:
在最高级别,字符串形式的URI引用(下文中简称为"URI")具有语法
Run Code Online (Sandbox Code Playgroud)[scheme:]scheme-specific-part[#fragment]...
不透明URI是绝对URI,其特定于节点的部分不以斜杠字符('/')开头.不透明的URI不需要进一步解析.
...
分层URI根据语法进行进一步解析
Run Code Online (Sandbox Code Playgroud)[scheme:][//authority][path][?query][#fragment]
像JAR URI一样jar:file:///home/me/foo.jar!/conf/被解析为:
jarfile:///home/me/foo.jar!/conf/由于特定于方案的部分不以" /," 开头,因此不能将其视为分层URI.URI类不会jar:特别处理(或任何)URI,因此无法识别该file://部分是分层的嵌套URI .
由于jar:URI是不透明的而不是分层的,因此它们受URI#relativize()记录的行为的影响:
给定URI对此URI的相对化计算如下:
- 如果此URI或给定URI是不透明的,[...],则返回给定的URI.
编辑:遗漏了关于不透明URI的关键部分.
| 归档时间: |
|
| 查看次数: |
1643 次 |
| 最近记录: |