OneJar网址有什么问题?

时间:2014-01-26 11:13:36

标签: java url onejar

我一直认为URL可以通过此constructor组成,并且可以使用类似

的内容
new URL(new URL("file:/foo/bar/"), "images/a.png")

我得到了

file:/foo/bar/images/a.png

正如预期的那样。 1 然而,从OneJar我获得了一个奇怪的网址和

的结果
new URL(new URL("onejar:foo.bar"), "images.a.png")

就是

onejar:images.a.png

简单地删除父路径。我尝试使用/.为部分添加前缀或后缀,但没有任何变化。 更新:情况并非如此,请参阅下文。

这是一个错误还是我错过了什么?我是否必须通过字符串(这感觉相当hacky)来做。

UPDATE:

我看到尾部的斜线确实有帮助。无论出于何种原因,onejar使用点作为分隔符,但它似乎也接受斜杠。因此,我可以将onejar:foo.bar之类的原始网址转换为字符串,附加/,然后转换回网址。然后可以通过上面提到的构造函数来组合结果,所以它似乎是正确的方法。


1,除非我忘记了我经常做的尾随斜线,但这是另一回事。

1 个答案:

答案 0 :(得分:2)

所以,除了你要调用的构造函数使用URL对象作为第一个参数而不是String这一事实之外,我想你看到的行为可能与某些事情有关。事件file方案URI是分层的,但如果你不提供任何层次结构符号(即斜杠),构造函数优先于上下文部分的规范部分(即第二个参数)(即第一个)参数)。

例如,当您忘记file:/foo/bar上的尾部斜杠时,您真正指出的是目录bar中的文件foo。如果你传递一个相对路径,如images/a.png,构造函数尽可能地将两者结合起来:当然它不能附加它认为是文件的相对路径,结果给出{{1所以它只是将file:/foo/bar/images/a.png文件替换为您作为第二个参数传递的文件,结果为bar

这同样适用于您的第二个示例:file:/foo/images/a.png表示file:foo.bar文件,但是当您传递表示foo.bar文件的第二个参数时,替换将按照前面的示例中的说明进行,给出images.a.png的结果。我相信这种情况会发生,因为您缺少层次结构符号(即斜杠),您需要使用它们才能获得所需的结果。

这真的是一种猜测,而不是一个很好的答案。

但是,当您键入:

file:images.a.png

URL url = new URL(new URL("file:foo.bar/"), "images.a.png"); System.out.println(url); 后缀附加到其中一个部分,正如您所说的那样,结果确实发生变化,与您所确认的相反,会产生以下结果:

/

这似乎与我的猜测一致。

尽管如此,由于我从未使用过OneJar,因此您的问题不清楚您的输入是什么,以及您希望获得的结果。