Если Вы хотите взять более математическую перспективу, мы можем рассмотреть перестановки 4 точек
В нашем случае существует 4 перестановки, которые находятся в по часовой стрелке порядке
A B C D
B C D A
C D A B
D A B C
, Все другие возможные перестановки могут быть преобразованы в одну из этих форм с 0 или 1 подкачкой. (Я только рассмотрю перестановки, запускающиеся с A, поскольку это симметрично)
Таким образом, только одна подкачка когда-либо необходима - но может потребоваться некоторая работа для идентификации который.
Путем рассмотрения первых трех точек и проверки знака области со знаком ABC, мы можем определить, являются ли они по часовой стрелке или нет. Если они по часовой стрелке тогда, мы - то, в случае, если 1 2 или 5
для различения эти случаи мы должны проверить еще два треугольника - если ACD по часовой стрелке тогда, мы можем сузить это для преобразования регистра 1, иначе мы должны быть то, в случае, если 2 или 5.
Для выбора между случаями 2 и 5 мы можем протестировать ABD
, который Мы можем проверить на случай ABC против часовой стрелки так же.
В худшем случае мы должны протестировать 3 треугольника.
, Если бы Ваши точки не выпуклы, Вы нашли бы внутреннюю точку, вид остальные и затем добавили бы его в любом краю. Обратите внимание, что, если четверка выпукла тогда, 4 точки больше исключительно определяют четверку, существует 3 одинаково допустимых четверки.
"Старый способ", о котором вы упомянули (и тот, который OSGI определенно использует под капотом), - это установить собственный ClassLoader для обеих ветвей ваших зависимостей. Вот как, например, серверы приложений могут запускать как старые, так и новые версии одного и того же приложения внутри одной JVM.
Прочтите об иерархии загрузчиков классов.
В вашей настройке сложной частью является точка соединения, где встречаются классы из обеих веток. Ни одна из ветвей не может использовать классы, загруженные в другую. Чтобы заставить его работать, убедитесь, что только классы, загруженные загрузчиком классов (классы JRE) или загрузчиком классов MY.jar, передаются в обе ветви.
OSGi может решить эту проблему. Пакет OSGi - это не что иное, как банка с дополнительными версиями подробных метаданных. У пакета есть номер версии и подробные номера версий (или диапазоны) зависимых jar-файлов.
См. эту вводную статью Javaworld для получения дополнительной информации.
Чтобы решить эту проблему без средств OSGi необходимость вручную компилировать и запускать совместимые jar-файлы. Как вы обнаружили, это не обязательно тривиальная задача. Поскольку jar-файлы не обязательно идентифицируют свои версии, единственный надежный способ сделать это - записать / сравнить контрольные суммы или подписи.
Многие библиотеки обратно совместимы. Но не все ..
Старый способ - попытаться использовать только одну версию.
Вероятно, безопаснее скомпилировать обе с одной и той же версией (последней).
По крайней мере, вы получаете ошибки времени компиляции вместо ошибок времени выполнения.
При необходимости вы можете немного изменить свою библиотеку, которая работает со старой зависимостью ...
Для этого потребуется доступ к исходному тексту ...
Обратите внимание, что совместимость во время компиляции также не гарантирует правильного поведения во время выполнения. Это один шаг, затем вы можете:
Как упоминалось в KLE, подход по умолчанию должен зависеть от более новой версии. Нет никакой гарантии, но в большинстве случаев это работает. Вероятно, лучший способ (хотя и раздутый) - использовать OSGI, чтобы справиться с этим.