Что не так с URL OneJar?
Я всегда думал, что URL
s может быть составлен с помощью этого конструктора, и с чем-то вроде
new URL(new URL("file:/foo/bar/"), "images/a.png")
я получил
file:/foo/bar/images/a.png
как и ожидалось. 1 Тем не менее, из OneJar я получаю странно выглядящий URL и результат
new URL(new URL("onejar:foo.bar"), "images.a.png")
это просто
onejar:images.a.png
Родительский путь просто отбрасывается. Я пытался поставить префикс или суффикс частей с /
или же .
, но ничего не меняется. Обновление: это не так, см. Ниже.
Это ошибка или я что-то упустил? Должен ли я сделать это через строки (что кажется довольно хакерским).
ОБНОВИТЬ:
Я вижу, что косая черта действительно помогает. Для любой причины, onejar
использует точки в качестве разделителей, но, похоже, также принимает косые черты. Таким образом, я могу взять исходный URL, как onejar:foo.bar
преобразовать в строку, добавить /
и преобразовать обратно в URL. Затем результат может быть скомпонован с помощью конструктора, упомянутого выше, поэтому он кажется правильным.
1, если я не забуду косую черту, что я делаю очень часто, но это другая история.
1 ответ
Итак, кроме того факта, что конструктор, который вы хотите вызвать, использует URL
объект в качестве первого параметра вместо String
Я думаю, что поведение, которое вы видите, может быть связано с тем, что file
URI схемы являются иерархическими, но если вы не предоставите какой-либо символ иерархии (то есть косую черту), конструктор отдает приоритет части спецификации (т.е. второму параметру) над частью контекста (то есть первым параметром).
Например, когда вы забудете косую черту на file:/foo/bar
что вы действительно указываете на файл bar
в каталоге foo
, Если вы проходите по относительному пути, такому как images/a.png
конструктор объединяет их как можно лучше: конечно, он не может добавить относительный путь к тому, что он считает файлом, давая в результате 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);
добавление /
суффикс к одной из частей, как вы говорите, имел место, результат действительно меняется, в отличие от того, что вы утверждаете, давая следующий результат:
file:foo.bar/images.a.png
что согласуется с моими догадками.
Тем не менее, поскольку я никогда не использовал OneJar, из вашего вопроса неясно, каков ваш вклад на самом деле, и что вы хотите получить в результате.