Что происходит, когда двум платформам Java нужен третий, но каждая две потребности различная версия третьей?

В моем проекте Java я использую две различных платформы (скажем, A.jar и B.jar), и они оба требуют общих основ (скажем, Log4j.jar), но в двух различных версиях. Как это рассматривает Java, если платформе Log4J v1.1 потребностей и B нужен Log4j v1.2? Это вызовет некоторый конфликт/ошибку, или будет так или иначе (как?) разрешенный?

Если это не вызовет конфликт/ошибку (мой проект может быть скомпилирован и выполнен) - я могу использовать какую-либо версию Log4j сам в этом проекте? Или я вынужден выбрать ниже / количество старшей версии Log4j?

Обновление: быть более конкретным... Что, если некоторая часть Log4j API, измененного в v1.2 (скажем, одна мелкая монета отдельного метода () измененная подпись) и и A и B называют мелкую монету. То, что будет, произошло? Мой проект будет работать? Это откажет на первом использовании мелкой монеты? Какая версия Log4j я должен поставить путь к классу - v1.2 или оба?

13
задан WildWezyr 11 January 2010 в 13:03
поделиться

4 ответа

Java Natsivic поддерживает управление несколькими версиями того же куска кода, то есть вы можете использовать только с одной версии только в том же JVM ( С классовым погрузчиком по умолчанию). Тем не менее, вопрос о проверке 1705720 , который имеет несколько ответов, указывающих на возможные способы достижения этого (OSGI или погрузчиков на заказ).

Но я сомневаюсь, что это стоит того, чтобы неприятность, поскольку несколько версий Log4J напрямую не требуются. В вашем случае я бы предложил начать использовать новую версию Log4j (v1.2) сначала и проверить, может ли оно вызвать какую-либо проблему для Framework A. Если она вызывает конфликт, а затем вернуться к log4j v1.1 и убедитесь снова. Если вам действительно не повезло, то вам нужно поднять ваши руки ...

Обновление : Для конкретного описания нет способа использования Log4j v1.1, либо v1.2, как каркас и B каждый требует разной подписи. Вы должны свернуть собственную версию любого из Log4J или Framework A, или B.

3
ответ дан 1 December 2019 в 23:47
поделиться

Существует краткое описание, которое не очень эффективно по времени, но укладывается в одну строку:

Set<String> h = new HashSet<>(Arrays.asList("a", "b"));

Опять же, это неэффективно по времени, поскольку вы создаете массив, преобразуете его в список и используете этот список для создания набора.

При инициализации статических конечных наборов я обычно пишу это так:

public static final String[] SET_VALUES = new String[] { "a", "b" };
public static final Set<String> MY_SET = new HashSet<>(Arrays.asList(SET_VALUES));

Немного менее уродливый и эффективность не имеет значения для статической инициализации.

-121--1777975-

если (str.charCodeAt (0) > = 0x590) & (str.charCodeAt (0) < = 0x5FF) то считается еврейским символом

-121--237772-

В схеме загрузки плоского класса отсутствует поддержка управления версиями библиотеки. Необходимо использовать последнюю версию библиотеки и удалить другие версии из пути к классам.

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


Изменить:

Что делать, если какая-то часть API Log4j изменена в версии 1.2 (допустим, изменился один метод doIt () сигнатура), и как A, так и B вызвать doIt . Что будет? Мой проект будет запущен? Произойдет ли сбой при первом использовании doIt ?

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

Какую версию Log4j я должен поместить на путь к классам - v1.2 или оба?

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

11
ответ дан 1 December 2019 в 23:47
поделиться

если (str.charCodeAt (0) > = 0x590) & & (str.charCodeAt (0) < = 0x5FF), то он считается еврейским символом

-121--237772-

Если ваш счастливый выбор одной версии сторонней банки будет просто работать. В конце концов, нужен контейнер, который понимает и позволяет управлять версиями всех компонентов сосуществовать, что-то вроде OSGI.

-121--2705537-

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

Оптимальным решением будет получение последних версий A и B, где обе используют последние общие библиотеки

0
ответ дан 1 December 2019 в 23:47
поделиться

Если ваш счастливый выбор одной версии третьей стороны JAR просто будет работать. В конце концов нужен контейнер, который понимает и позволяет версию компонентов всех сосуществовать, что-то вроде ОСГИ.

3
ответ дан 1 December 2019 в 23:47
поделиться
Другие вопросы по тегам:

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