Java – перемещение ссылок во время выполненияJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Java – перемещение ссылок во время выполнения

Сообщение Anonymous »

Итак, во-первых, я знаю, что вы можете переместить все ссылки на скомпилированный jar-файл с помощью различных теневых плагинов в разных системах сборки. Я знаю, как это работает, и уже использую это. Однако я столкнулся с проблемой, из-за которой я не могу сделать это во время компиляции.

Я упрощу свою ситуацию, чтобы ее было легче понять (но я объясню полную картину внизу, если вам интересно).

Я пишу плагин для двух разных (но похожих) систем (один jar на все). Эти платформы отвечают за запуск базового программного обеспечения и загрузку/запуск всех плагинов (поэтому я не могу контролировать приложение, включая параметры запуска).

Платформа A предлагает мне библиотеку (назовем ее com.example.lib). И платформа B тоже. Но было решено переместить его в org.b.shadow.com.example.lib.

Теперь в основном коде (коде, используемом на обеих платформах) моего плагина я использую библиотеку. Теперь, хотя я могу определить, на какой платформе я нахожусь, я в настоящее время не знаю, как я могу переписать все ссылки в моем коде на библиотеку во время выполнения, чтобы она работала на платформе B.

Из того, что я нашел, кажется, что мне нужно использовать собственный ClassLoader, чтобы добиться этого. Проблема здесь в том, что я не знаю, смогу ли среда выполнения использовать мой собственный ClassLoader. Или с чего начать.

Важно то, что эти перемещения могут повлиять только на ссылки в классах из моих пакетов (

Код: Выделить всё

me.brainstone.project
, например).

Другая зависимость, которую я использую (и заштриховала), использует ASM и ASM Commons, поэтому, если с ними можно сделать то же самое, это было бы потрясающе!

Итак, вкратце. Я хотел бы при необходимости переместить ссылки (на другие классы) только в мои классы во время выполнения.

Изменить:

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



Теперь я привожу более подробное объяснение моей настройки.

Во-первых, я хотел бы предварить то, что я осознаю, что могу просто создать два разных jar-файла для разных платформ. И я уже это делаю. Но поскольку на удивление многие люди не могут этого понять, и я устал объяснять это снова и снова (это люди, которые не стали бы читать документацию, чтобы спасти свою жизнь), я бы хотел просто предложить один jar для обоих, даже если это означает, что мне придется потратить значительное время на то, чтобы заставить его работать (я предпочитаю это постоянным объяснениям).

Теперь моя фактическая настройка выглядит так: На платформе A предоставляется библиотека, но на платформе B это не так. Я знаю, что другие плагины часто используют библиотеку, затеняя ее (многие из них не перемещаются, вызывая всевозможные проблемы). Поэтому, чтобы предотвратить любые конфликты, я загружаю библиотеку, перемещаю классы внутри этой банки с помощью jar-relocator, а затем внедряю ее в путь к классам, используя отражения. Недостаток этого случая: в настоящее время я не могу использовать библиотеку, если она будет перемещена. Вот почему я хотел бы изменить ссылки в моем коде во время выполнения. И это также объясняет, почему я не хочу менять ссылки на другие классы, потому что я не хочу случайно сломать эти другие плагины. Я также думаю, что если я смогу каким-то образом использовать свой собственный ClassLoader, мне не нужно будет вставлять jar-файлы в основной ClassLoader, потому что тогда я могу просто сказать этому ClassLoader использовать дополнительные jar-файлы, не прибегая к отражениям.

Но, как я уже сказал, насколько я понимаю, проблема та же, что и в упрощенной версии.

Подробнее здесь: https://stackoverflow.com/questions/576 ... at-runtime
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»