java.net.URI.relativize不';不能使用JAR URI
我有两个URI对象。一个指向JAR文件中的文件夹,另一个指向同一JAR文件中的文件。该文件位于第一个URI指定的目录的子文件夹中。我喜欢创建一个相对URI,这样得到的URI只包含JAR中文件的相对路径java.net.URI.relativize不';不能使用JAR URI,java,uri,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:
- 文件夹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
- 调用
后,我希望得到以下URI:folderUri.relative(resourceURI)
somesubpath/someconfig.xml
这是一个bug还是我做错了什么?
somesubpath/someconfig.xml
不是URI;缺少协议(如文件:
)。事实上,只有一个完整的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协议不处理基本文档/dir,比如/conf
因此,只能使用绝对路径。URI代表唯一资源标识符的结果
没有包含相关文档(.js)的基础文档(.html)
URI用于检索数据。如何为jar中的文件编写相对URI?相对于哪里?由于“jar:”协议只在java代码中使用,因此没有“当前文件”的上下文。所以没有实现相对URI。我对此也有点恼火。答案与JAR文件的语义无关,它与
JAR:
uri的语法有关。要“相对化”,URI必须是层次化的,而不是不透明的。您将从JavaDoc for java.net.URI中注意到:
在最高级别,字符串形式的URI引用(以下简称“URI”)具有以下语法
[scheme:]scheme-specific-part[#fragment]
[scheme:][//authority][path][?query][#fragment]
不透明URI是其方案特定部分不以斜杠字符(“/”)开头的绝对URI。不透明URI不受进一步解析的约束
层次URI根据语法进行进一步解析
[scheme:]scheme-specific-part[#fragment]
[scheme:][//authority][path][?query][#fragment]
类似于JAR的JAR URI:file:///home/me/foo.jar!/conf/
解析为:
- 方案=
jar
- 方案特定部分=
file:///home/me/foo.jar!/conf/
- 片段=(无)
/
”开头,因此不能将其视为分层URI。URI类不专门处理jar:
(或任何)URI,因此它无法识别文件://
部分是分层的嵌套URI
由于jar:
uri是不透明的,没有层次结构,因此它们受以下行为的约束:
给定URI与此URI的相对化计算如下
如下:
编辑:省略了关于不透明URI的一个关键部分。我对文件系统URI使用了相同的代码(以file:)并且relativize返回了我所期望的相对URI的相对文件路径。URI类中甚至有一个isAbsolute()函数来检查它。@JoopEggen这几乎在每一点上都是错误的。JAR文件中目录的JAR URI当然是可能的:
getClass().getClassLoader().getResource(“conf/”)
将返回它们,如果您的JAR中有这样的目录。在任何情况下,JAR文件的语义都是无关的,因为URI类只关心语法,而somepath/somefile.xml
是一个URI。这是一个相对的等级制度。至于你的“JARs中没有基本文档”理论:JAR文件中的HTML文件有一个链接的相对URI如何?没有概念上的理由说明为什么不能拥有相对于JAR URI的URI。这里的问题是语法。@TimYates:读了你的答案后——这让我很高兴,只是为了它的定义形式,我在我的答案中解释了jar:
没有状态(基本文档)。我的答案是:正常的jar处理没有当前的基础。我想说,java编程的web浏览器可以相对化,这主要不是因为缺少(=非法的)jar://
+/
。您在技术上是正确的,并且您得到了我的upvote.URI.resolve()也不理解jar方案/协议。但URL(URL)确实如此。