Classloader Java - как сослаться на различные версии банки

Если Вы хотите взять более математическую перспективу, мы можем рассмотреть перестановки 4 точек

В нашем случае существует 4 перестановки, которые находятся в по часовой стрелке порядке

A B C D
B C D A
C D A B
D A B C

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

  1. А B C D - сделанный
  2. , А B D C - подкачивают C и D
  3. , А C B D - подкачивают B и C
  4. , А C D B - подкачивают A и B
  5. , А D B C - подкачивают A и D
  6. , А D C B - подкачивают B и D

Таким образом, только одна подкачка когда-либо необходима - но может потребоваться некоторая работа для идентификации который.

Путем рассмотрения первых трех точек и проверки знака области со знаком ABC, мы можем определить, являются ли они по часовой стрелке или нет. Если они по часовой стрелке тогда, мы - то, в случае, если 1 2 или 5

для различения эти случаи мы должны проверить еще два треугольника - если ACD по часовой стрелке тогда, мы можем сузить это для преобразования регистра 1, иначе мы должны быть то, в случае, если 2 или 5.

Для выбора между случаями 2 и 5 мы можем протестировать ABD

, который Мы можем проверить на случай ABC против часовой стрелки так же.

В худшем случае мы должны протестировать 3 треугольника.

, Если бы Ваши точки не выпуклы, Вы нашли бы внутреннюю точку, вид остальные и затем добавили бы его в любом краю. Обратите внимание, что, если четверка выпукла тогда, 4 точки больше исключительно определяют четверку, существует 3 одинаково допустимых четверки.

19
задан mickthompson 12 October 2009 в 09:28
поделиться

4 ответа

"Старый способ", о котором вы упомянули (и тот, который OSGI определенно использует под капотом), - это установить собственный ClassLoader для обеих ветвей ваших зависимостей. Вот как, например, серверы приложений могут запускать как старые, так и новые версии одного и того же приложения внутри одной JVM.

Прочтите об иерархии загрузчиков классов.

В вашей настройке сложной частью является точка соединения, где встречаются классы из обеих веток. Ни одна из ветвей не может использовать классы, загруженные в другую. Чтобы заставить его работать, убедитесь, что только классы, загруженные загрузчиком классов (классы JRE) или загрузчиком классов MY.jar, передаются в обе ветви.

7
ответ дан 30 November 2019 в 05:09
поделиться

OSGi может решить эту проблему. Пакет OSGi - это не что иное, как банка с дополнительными версиями подробных метаданных. У пакета есть номер версии и подробные номера версий (или диапазоны) зависимых jar-файлов.

См. эту вводную статью Javaworld для получения дополнительной информации.

Чтобы решить эту проблему без средств OSGi необходимость вручную компилировать и запускать совместимые jar-файлы. Как вы обнаружили, это не обязательно тривиальная задача. Поскольку jar-файлы не обязательно идентифицируют свои версии, единственный надежный способ сделать это - записать / сравнить контрольные суммы или подписи.

4
ответ дан 30 November 2019 в 05:09
поделиться

Многие библиотеки обратно совместимы. Но не все ..


Старый способ - попытаться использовать только одну версию.

Вероятно, безопаснее скомпилировать обе с одной и той же версией (последней).
По крайней мере, вы получаете ошибки времени компиляции вместо ошибок времени выполнения.

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


Обратите внимание, что совместимость во время компиляции также не гарантирует правильного поведения во время выполнения. Это один шаг, затем вы можете:

  • прочитать файл WhatsNew для новой версии jar
  • поискать в Интернете пользователей, сообщающих о проблемах совместимости
  • написать JUnits
  • сравнить коды в обоих jar-файлах
1
ответ дан 30 November 2019 в 05:09
поделиться

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

1
ответ дан 30 November 2019 в 05:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: