Работа с повторяющимися полными именами

Как говорится в заголовке, есть ли способ справиться с этим? Я импортировал две отдельные сторонние библиотеки, и у них есть полный конфликт имен классов.

Сейчас обе библиотеки импортируются в формате jar, и кажется, что в некоторых средах (вызов командной строки, Eclipse) найден правильный класс, а в других (Maven) найден неправильный класс, и я получаю исключение отсутствующего метода. Если решение не найдено, я могу вернуться к рефакторингу одной из этих библиотек и пересобрать банку, но я бы не хотел повторять эту работу каждый раз, когда библиотека обновляется.

Редактировать: Если кто-то увидит это позже и запутается, я принял ответ Дэйва Ньютона, потому что это был бы правильный способ сделать это, если бы вы были достаточно усердны, чтобы решить эту проблему, прежде чем писать весь свой код. Автоматическое исправление импорта после написания всего кода оказалось невозможным, как я и подозревал.


person Alex N.    schedule 10.10.2012    source источник
comment
Это две разные библиотеки? С тем же классом? Какие библиотеки и классы они?   -  person zvez    schedule 10.10.2012
comment
org.openstreetmap.osmosis.core.database.DatabaseLoginCredentials. Он существует как в основных библиотеках Open Streetmap, так и в библиотеках подпроекта под названием Traveling Salesman. А они немного разные.   -  person Alex N.    schedule 10.10.2012


Ответы (1)


Ты либо заштриховываешь, разбираешь их и удаляешь дубликаты, либо...

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

Дальнейшее обсуждение в этот вопрос SO.

person Dave Newton    schedule 10.10.2012
comment
Я прочитал ваш другой ответ, и это выглядит интересной идеей, но я потерялся в одном ключевом моменте. Прямо сейчас у меня есть импорт, который выглядит как import foo.bar.baz; которые неоднозначны, потому что этот класс находится в двух отдельных банках. Если я переупакую и переименую одну банку, как код узнает, нужно ли искать в старой банке или в новой банке? - person Alex N.; 10.10.2012
comment
@АлексН. Помните, что оператор import — это просто синтаксическое удобство: в байт-коде классы всегда являются полными. Когда вы затеняете, ваш импорт обновляется (если вы затеняете) до нового имени, а также затененные пакеты. С вашей точки зрения он не ищет в той или иной банке, он находит полностью квалифицированный класс в пути к классам, независимо от его местоположения. - person Dave Newton; 10.10.2012
comment
Верно, но я до сих пор не понимаю, как он может знать, как обновить класс. Даже если бы я каждый раз выписывал полный класс, как он мог определить, какой класс я имел в виду изначально? Нужно ли мне сгенерировать файл dependency-reduced-pom.xml, а затем отредактировать мой код, чтобы он соответствовал ему? На самом деле я пытался добавить плагин тени в Maven, и он сгенерировал банку и новый pom, но неправильно обновил путь к классам. - person Alex N.; 10.10.2012
comment
@АлексН. Что вы подразумеваете под неправильным обновлением пути к классам? Зависимости определяют, какие фрагменты нуждаются в каких jar-файлах. Вы можете исключить зависимость от Maven <dependency>, если вам нужно. - person Dave Newton; 10.10.2012
comment
Хм. Кажется, я затрудняюсь сформулировать это. Если текущий источник имеет импорт, который импортирует идентичные классы, как что-нибудь может сказать, какой класс я хочу при каждом упоминании? На самом деле я уже достаточно прочитал, чтобы думать, что это невозможно сделать автоматически, чего я и боялся. Спасибо за помощь. - person Alex N.; 11.10.2012
comment
@АлексН. Правильный; если ваш код полагался на причуды загрузки классов, вам нужно вручную курировать свои зависимости. Если ваш код сочетает требования к версии, это особенно проблематично. Вы все еще можете использовать исключения, но без дополнительных деталей это трудно сказать. - person Dave Newton; 11.10.2012
comment
Это точно правильно. Нам, видимо, уже давно везло, но никто этого не замечал. В очередной раз благодарим за помощь. Это действительно подтолкнуло меня в правильном направлении. - person Alex N.; 12.10.2012