Что не так с 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, из вашего вопроса неясно, каков ваш вклад на самом деле, и что вы хотите получить в результате.

Другие вопросы по тегам