java.net.URI.relativize不';不能使用JAR URI

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文件中的文件夹,另一个指向同一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.relative(resourceURI)
    后,我希望得到以下URI:

    somesubpath/someconfig.xml
    
然而,我得到了resourceURI,这意味着根据JDK代码发现这两条路径互不相关


这是一个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是不透明的[…],则返回给定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)确实如此。