Есть ли способ "псевдонима" одного класса в Java для другого?
У меня есть следующая проблема совместимости API и поиск путей ее решения.
TL; DR Есть ли способ создать "псевдоним" для класса в Java? То есть некоторый трюк, чтобы сделать com.acme.foo.SomeEnum
псевдоним для com.acme.bar.SomeEnum
?
Длинная история. (Я немного анонимный, чтобы избежать fingerpointing.)
Я работаю с мощным инструментом Java, который также поддерживает плагины. Там нет строго определенного публичного API (в смысле того, что вы можете и не можете коснуться), просто обычные частные/защищенные/пакетные/общедоступные классы, методы и поля. Существуют определенные точки расширения (например, expand com.acme.plugin.Plugin
class), но тогда вы получите доступ к широкой области внутренних инструментов инструмента.
В недавнем обновлении малой версии (например, 1.2.3
→ 1.2.4
) разработчики инструментов переместили один класс enum в другой пакет - com.acme.foo.SomeEnum
стал com.acme.bar.SomeEnum
. Я думаю, что это считалось просто тривиальным рефакторингом, а не реструктуризацией сериалов.
Этот класс, однако, кажется, использовался несколькими плагинами. В результате эти плагины теперь несовместимы с последней версией. Большинство плагинов весьма полезны, но не активно поддерживаются. Люди писали их много лет назад - и они просто работали на протяжении многих лет, с десятками обновлений версий. Таким образом, это имеет потенциал отрицательного влияния на экосистему плагина инструмента.
Мой вопрос: если есть какой-то способ в Java создать "псевдоним" com.acme.foo.SomeEnum
для com.acme.bar.SomeEnum
? Это позволит старым плагинам продолжать работу с новой версией инструмента.
Какой-то уловщик класса? В JavaScript, который был бы тривиальным для прокладки, но в Java?
Почему я спрашиваю об этом. Я являюсь автором плагина Maven, который обертывает этот инструмент. Поэтому я мог бы легко добавить свой сахар к этому кофе, например, загрузчики классов и так далее. Если есть технический способ сделать эту работу, я бы мог сохранить большую часть экосистемы плагинов инструментов - по крайней мере для пользователей Maven.
Я связался с продавцом инструмента, но не уверен в успехе.
Просто, чтобы понять это - я не являюсь продавцом этого инструмента. Я (а) пишу плагины для инструментов (и не испытываю больших проблем с обновлением моих плагинов), и (б) я являюсь автором the-tool-maven-plugin
, который позволяет выполнить Инструмент в сборке Maven. Я также много проконсультирую о Инструменте и забочусь о его экосистеме (есть много очень полезных плагинов).
Обновление
Конец истории: разработчики The Tool учли мои очки и решили вернуть изменения. Престижность для этого!
Ответы
Ответ 1
Я предлагаю использовать jarjar. Это инструмент, который позволит вам переупаковывать классы в библиотеке. Вы можете запустить это против последней версии инструмента и переместить класс SomeEnum в пакет, который не конфликтует с плагинами.
В Приступая к работе doc имеет пример с jaxen.jar, который будет иметь отношение к вашей ситуации.