Доступ к нескольким версиям пакета в Java - PullRequest
6 голосов
/ 14 декабря 2010

У нас есть несколько приложений, которые используют Apache HTTPClient 3 для выполнения HTTP-запросов.Недавно мы также начали создавать клиенты веб-служб, которые используют HTTPClient 4 по разным причинам.Позиция Apache заключается в том, что « основные выпуски не имеют обратной совместимости ».Хотя я бы хотел обновить все наши проекты до версии 4, это просто невозможно.

Итак, хотя мой главный вопрос довольно общий, мой конкретный вопрос таков. Как я могу использовать HTTPClient версии 3 и 4 в одном приложении? В нашем случае приложение может быть веб-приложением, приложением для настольного компьютера или командной строкой.

Я прочитал ТАК вопрос о java-динамически загружать несколько версий одного и того же класса , который кажется полузакрытым, но меня не очень волнует динамическая часть.На самом деле я хотел бы, чтобы JAR-файлы поставлялись вместе с приложением (например, WEB-INF / lib для веб-приложений). Я также вижу, что OSGi много упоминал в вопросах, похожих на этот, но это кажется излишнимили, может быть, слишком сложный (может быть, простой пример может доказать обратное).

В конце я хочу иметь возможность передать команде набор банок, которые они могут вставить, и он просто работает независимо от их проекта, используяHTTP-клиент 3.

Ответы [ 4 ]

6 голосов
/ 16 декабря 2010

Как уже говорили другие, вы можете создать несколько загрузчиков классов и загрузить две версии по отдельности. Эта часть достаточно проста.

Проблема в том, что это по существу разделяет ваше «пространство классов», и все равно будет очень трудно сослаться на v3 из некоторых частей вашего приложения, в то же время ссылаясь на v4 из других частей вашего приложения. Вам придется аккуратно разбить ваше приложение на ... так почему бы просто не разделить его и не доставить два приложения?

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

2 голосов
/ 14 декабря 2010

Простым, но простым решением было бы получить исходные тексты для HttpClient3 и HttpClient4 и изменить имена пакетов на что-то вроде

org.apache.commons.httpclient3 для HttpClient3 и org.apache.commons.httpclient4 для HttpClient4, чтобы избежать столкновения.Затем скомпилируйте, упакуйте, готово.

Теперь легко переключаться между двумя реализациями, и они не сталкиваются в загрузчике классов.

1 голос
/ 14 декабря 2010

Вы должны использовать отдельные загрузчики классов для v3 и v4. Разместите jar v3 и v4 в отдельных папках за пределами вашего classpath приложения. Используйте URLClassLoadedr для загрузки каждой из версий. URL-адрес, который вы передаете каждому из загрузчиков классов, должен содержать URL-адрес конкретной версии клиента HTTP.

Но могу ли я дать вам совет? Прежде чем начать, убедитесь, что все это действительно нужно. Это верно, что версии могут быть несовместимы. Но есть огромный шанс, что они есть.

1 голос
/ 14 декабря 2010

Используйте несколько загрузчиков классов, по одному для каждого HTTP-клиента, которого вы хотите охватить.

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

...