Динамически управлять двумя файлами JAR с одинаковыми именами пакетов и классов - PullRequest
4 голосов
/ 10 марта 2010

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

Возможно ли это?

Ответы [ 4 ]

6 голосов
/ 07 января 2011

Вы всегда можете написать свой собственный ClassLoader и связать его со стандартным ClassLoader.

http://download.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html

Я использовал этот метод 10 лет назад, чтобы загрузить классы, которые были получены через сокеты, и указалв файле XML (также через сокеты).Моя java-программа не знала, что классы существуют еще до того, как она получила XML-файл и классы.

2 голосов
/ 10 марта 2010

Используя пакеты OSGi, вы можете сделать это. Взгляните на http://blog.springsource.com/2008/02/18/creating-osgi-bundles/. Поиск "нескольких версий".

1 голос
/ 11 января 2011

Если вы используете инструмент сборки, такой как maven, вы можете определить разные jar-файлы (зависимости) для разных областей (тест или производство).

Вы также можете использовать профили maven для определения другого набора файлов / версий jar.

1 голос
/ 11 января 2011

Джастиндж,

Предложение chrisparker2000 выглядит наиболее выполнимым - вам нужно написать собственный загрузчик классов, единственное изменение, о котором я могу подумать, это что-то вроде следующего: 1. Для клиентских доставляемых jar - скажем client.dev.jar и client.prod.jar, переименуйте в другое расширение и поместите их в classpath. Переименуйте другое расширение, чтобы контейнер не загружал содержимое банки.

  1. Используя пользовательский загрузчик классов, загружайте содержимое по требованию на основе решения, предлагаемого chrisparker2000, помещая небольшой фасад поверх клиентских классов, скажем, ClientClassFactory, который основан на среде (dev / prod / что-нибудь еще) используйте пользовательский загрузчик классов для загрузки из client.dev.otherext или client.prod.otherext.
...