Есть ли способ "псевдонима" одного класса в Java для другого?

У меня есть следующая проблема совместимости API и поиск путей ее решения.

TL; DR Есть ли способ создать "псевдоним" для класса в Java? То есть некоторый трюк, чтобы сделать com.acme.foo.SomeEnum псевдоним для com.acme.bar.SomeEnum?

Длинная история. (Я немного анонимный, чтобы избежать fingerpointing.)

Я работаю с мощным инструментом Java, который также поддерживает плагины. Там нет строго определенного публичного API (в смысле того, что вы можете и не можете коснуться), просто обычные частные/защищенные/пакетные/общедоступные классы, методы и поля. Существуют определенные точки расширения (например, expand com.acme.plugin.Plugin class), но тогда вы получите доступ к широкой области внутренних инструментов инструмента.

В недавнем обновлении малой версии (например, 1.2.31.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, который будет иметь отношение к вашей ситуации.