Итак, во-первых, я знаю, что вы можете переместить все ссылки на ваш скомпилированный jar с различными плагинами shadow в разных системах сборки. Я знаю, как это работает, и уже использую это. Однако я столкнулся с проблемой, когда я не могу сделать это во время компиляции.
Я упросту свою ситуацию, чтобы ее было легче понять (но я объясню полную картину внизу, если вам интересно).
Я пишу плагин для двух разных (но похожих) систем (одна фляга). Эти платформы отвечают за запуск базового программного обеспечения и загрузку/запуск всех плагинов (поэтому у меня нет контроля над приложением, включая параметры запуска).
Платформа A
предлагает мне библиотеку (пусть назовем ее com.example.lib
). И платформа тоже B
. Но он решил переместить его в org.b.shadow.com.example.lib
.
Теперь в основном коде (код, используемый на обеих платформах) моего плагина я использую библиотеку. Теперь, когда я могу определить, на какой платформе я работаю, в настоящее время я не знаю, как переписать все ссылки в моем коде на библиотеку во время выполнения, чтобы она работала на платформе B
.
Судя по тому, что я обнаружил, мне кажется, что для этого нужно использовать кастом ClassLoader
. Проблема здесь в том, что я не знаю, смогу ли я заставить среду выполнения использовать свой кастом ClassLoader
. Или с чего начать на самом деле.
Одна важная вещь заключается в том, что эти перемещения могут влиять только на ссылки в классах из моих пакетов (например, me.brainstone.project
).
Другая зависимость, которую я использую (и заштриховал), использует ASM и ASM Commons, так что если это возможно, то это будет удивительно!
Итак, в заключение. При желании я могу переместить ссылки (на другие классы) только в мои классы во время выполнения.
Редактирование:
Несмотря на всю мою (оригинальную) почту, я когда-либо говорил только об одной библиотеке, я хотел бы отметить, что я буду делать это для нескольких библиотек. И для того, чтобы делать вещи, которые требуют от меня значительных усилий (написание оберток для каждой библиотеки (класса или раздела) было бы значительным усилием), чтобы позволить мне использовать библиотеку, это не то, что я ищу. Вместо этого я хочу решение, которое требует минимальных дополнений для добавления новых библиотек в смесь.
Теперь немного более подробное объяснение моей настройки.
Во-первых, я хотел бы предисловие, что я знаю, что я могу просто создать две разные банки для разных платформ. И я уже делаю это. Но так как удивительно, что многие люди не могут понять это, и я устаю объяснять это снова и снова (это люди, которые не читают документы, чтобы спасти свою жизнь), я хотел бы просто предложить одна банка для обоих, даже если это означает, что мне нужно потратить значительное время на то, чтобы заставить его работать (я очень предпочитаю это, чем постоянно объяснять это).
Теперь моя фактическая настройка выглядит следующим образом: на платформе A
библиотека предоставляется, а на платформе B
- нет. Я знаю, что другие плагины часто используют библиотеку, затеняя ее (многие не перемещаются, вызывая всевозможные проблемы). Поэтому, чтобы предотвратить любые конфликты, я загружаю библиотеку, перемещаю классы внутри этого jar с помощью jar-relocator и затем внедряю ее в путь к классам, используя отражения. Недостатком в этом случае я в настоящее время не могу использовать библиотеку, если она перемещена. Вот почему я хотел бы изменить ссылки в моем коде во время выполнения. И это также объясняет, почему я не хочу менять ссылки на другие классы, потому что я не хочу случайно сломать эти другие плагины. Я также думаю, что если я могу каким-то образом использовать свой собственный ClassLoader
, мне не нужно вводить банки в основной ClassLoader
, потому что тогда я могу просто сказать, что ClassLoader
использовать дополнительные банки без необходимости прибегать к отражениям.
Но, как я уже сказал, из того, что я понимаю, проблема та же, что и в упрощенной версии.