Приветствую!
Как и обещал - вторая часть рассказа про загрузку jar, находящихся внутри другого jar.
Сегодня мы рассмотрим случай, когда у нас есть статически прилинкованный jar, внутри которого если несколько других библиотек, и нам нужно загрузить их все.
Здесь ключевым моментом является получения URL на "внешний" jar. Проще всего это сделать из класса, находящегося в этой библиотеке. Для этого вызываем (предполагаем, что класс называется ThisClass):
ThisClass.class.getProtectionDomain().getCodeSource().getLocation();
А далее по URL получаем путь к файлу (а это, напомню, настоящий файл на файловой системе) через вызов метода getPath().
После чего нам ничто не мешает создать File по пути и JarFile по файлу.
Далее все совсем просто - бегаем по JarEntry нашего "внешнего" jar-файла и если находим в нем вложенный jar-файл, то загружаем его как было описано в первой части статьи - выгрузка во временный файл и передача URLClassLoader URL этого файла.
Надо только не забыть правильно сформировать имя для временного файла, т.е. сделать что-то типа jarEntry.getName().replace('/', '_').
Как и обещал - вторая часть рассказа про загрузку jar, находящихся внутри другого jar.
Сегодня мы рассмотрим случай, когда у нас есть статически прилинкованный jar, внутри которого если несколько других библиотек, и нам нужно загрузить их все.
Здесь ключевым моментом является получения URL на "внешний" jar. Проще всего это сделать из класса, находящегося в этой библиотеке. Для этого вызываем (предполагаем, что класс называется ThisClass):
ThisClass.class.getProtectionDomain().getCodeSource().getLocation();
А далее по URL получаем путь к файлу (а это, напомню, настоящий файл на файловой системе) через вызов метода getPath().
После чего нам ничто не мешает создать File по пути и JarFile по файлу.
Далее все совсем просто - бегаем по JarEntry нашего "внешнего" jar-файла и если находим в нем вложенный jar-файл, то загружаем его как было описано в первой части статьи - выгрузка во временный файл и передача URLClassLoader URL этого файла.
Надо только не забыть правильно сформировать имя для временного файла, т.е. сделать что-то типа jarEntry.getName().replace('/', '_').
Комментариев нет:
Отправить комментарий