Каковы последствия наличия дублирующих классов в java jar? - PullRequest
10 голосов
/ 25 января 2012

Я создаю файл java jar, используя ant.Мне нужно включить дополнительные jar-файлы, используя "zipfileset src =" xxx.jar "" zipfileset src = "yyy.jar", и оба xxx.jar и yyy.jar имеют классы с ЖЕ полностью определенными именами классов.Таким образом, полученный файл JAR имеет повторяющиеся имена классов.Каковы возможные последствия наличия дубликатов?

Спасибо.

Ответы [ 5 ]

16 голосов
/ 25 января 2012

Если они являются дублирующими реализациями, ничего - не имеет значения, какой загружен.

Если нет, вы зависите от порядка загрузки классов и можете получить версию, отличную от желаемой.

В указано , что записи пути к классам будут искать в указанном порядке (согласно этому документу пути к классам ). но это актуально, только если вы полностью контролируете создание пути к классам (например, в отличие от веб-приложения).

(С учетом того, что подстановочный знак classpath делает порядок недетерминированным.)

5 голосов
/ 25 января 2012

Как правило, такая ситуация крайне не рекомендуется, и ее следует избегать.

Банки в java - это просто контейнеры для ваших файлов классов.Java использует загрузчики классов, которые смотрят на путь к классам и загружают файлы классов оттуда.так что если у вас есть 2 jar A.jar и B.jar, которые имеют один и тот же класс xyFoo внутри, будет загружен класс из jar, который находится первым в пути к классам.Итак, если ваш classpath - A.jar, B.jar (в этом порядке), класс Foo из A.jar будет использоваться во время выполнения.Это несоответствие может привести к очень трудно исправить ошибки из моего опыта

1 голос
/ 25 января 2012

что значит дубликат? очевидно, что вы не можете иметь 2 класса с одинаковыми именами в одном и том же пакете (даже ваш проект не будет компилироваться), но если вы имеете в виду, что у вас есть 2 класса с одинаковым именем в разных пакетах, это «нормально».

0 голосов
/ 31 августа 2017

Другой ответ, который я не вижу здесь обсуждаемым, заключается в том, что если вы планируете подписывать свои jar, aars, apks, то он подписывает, что у вас есть дублирующиеся записи

jarsigner: unable to sign jar: java.util.zip.ZipException: duplicate entry: com/foo/bar/baz.java
0 голосов
/ 25 января 2012

Я согласен с Дейвом.

Можете ли вы разделить их по пространству имен, чтобы избежать подводных камней, которые он предлагает?

...