Как я могу переопределить класс, используя отдельный jar? - PullRequest
5 голосов
/ 19 января 2009

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

Заранее спасибо.

Ответы [ 5 ]

11 голосов
/ 19 января 2009

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

РЕДАКТИРОВАТЬ: Я планировал написать этот бит раньше, но был прерван в конце поездки на поезде ...

Я бы вернулся к клиенту и объяснил, что, хотя то, что они просят, возможно, это может вызвать неожиданные проблемы. Обновление JAR-файла - это гораздо более безопасное решение с гораздо меньшим риском. Фразы «неожиданные проблемы» и «риск» могут вызвать у клиента тревожные звонки, поэтому, надеюсь, они позволят вам поступить правильно.

3 голосов
/ 19 января 2009

Да и нет, это зависит от вашей среды.

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

Если вы используете простую старую Java без какой-либо необычной пользовательской загрузки классов, вам следует использовать ее раньше в своем пути к классам (как уже упоминалось).

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

2 голосов
/ 20 января 2009

Все ответы, которые предусматривают размещение обновленных классов перед теми, которые они заменяют в пути к классам, являются правильными, только при условии исходный JAR не запечатан или подписан.

1 голос
/ 19 января 2009

Да, это возможно, если поместить его на путь к классу раньше, чем ваш оригинальный сосуд. Тем не менее, полагаясь на порядок вашего classpath не всегда приведет к счастью. Я не уверен, задокументировано ли это даже в спецификации языка Java; если нет, то он будет работать для разных JVM и даже для разных версий одной и той же JVM.

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

0 голосов
/ 18 ноября 2012

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

...