嵌套罐子:URI

Nested jar: URI

jar: URI scheme 的格式简单定义为jar:<url>!/[<entry>].

是否可以将两个这样的 URI“嵌套”在一起,并以这种方式在一个存档中引用一个存档中的文件?类似于:

jar:jar:http://example.com/!/archive!/file

这应该在存档 jar:http://example.com/!/archive 中指定 /file,即在 http://example.com/ 提供的文件中找到的 /archive。但是,URL.openConnection 抛出异常:

java.net.MalformedURLException: no !/ in spec

我也无法将 ! 替换为 %21,因为这会使 jar: URI 无效,而且我不知道可以执行任何转义。这有可能吗?或者,作为一个更通用的问题,是否可以在 <url> 中存储带有 !/ 的 URI,以便保留它?

如源代码中所述java.net.JarURLConnection 不处理嵌套的 Jar URI。

您的示例 jar:jar:http://example.com/!/archive!/file 在存档 jar:http://example.com/ 中被解析为条目 archive!/file。后者不是有效的 jar URI。您不能转义 !/ 序列,因为 jar: 之后和 !/ 之前的文本必须是没有任何翻译的有效 URI。

您当然可以提供自己的 URLConnection 支持嵌套 Jar URI 的实现。

虽然另一个答案在 JarURLConnection 的情况下确实是正确的,但 jar: 和类似 URI 的使用不限于此。 Apache Commons VFS:

就是这种情况

jar:// <em>arch-file-uri</em>[! <em>absolute-path</em>]

Where arch-file-uri refers to a file of any supported type, including other zip files. Note: if you would like to use the ! as normal character it must be escaped using %21.

“普通字符”表示在存档内文件路径中使用字符,而不是在内部 URI 中。这使得 jar:jar:http://example.com/!/archive!/file 有效,因为它是 ! 最后一次 出现应该用作分隔符。

请注意,内部 URI 可能仍应保持未转义,因此无法在那里使用 #