Могу ли я вызвать файлы классов, которые находятся в библиотеке jar, расположенной в другом файле jar?
Я пытаюсь получить доступ к файлам классов, упакованным в виде библиотеки, но, к сожалению, библиотеки JAR должны быть упакованы в другой файл JAR.
В качестве примера скажем, у меня есть.jar, который содержит некоторые библиотеки классов. Я могу вызвать (импортировать) классы в jar-файле из моего внешнего java-приложения. Теперь мне нужно поместить этот a.jar в другой jar, скажем, b.jar, и мне нужно получить доступ (импортировать) классы в a.jar извне b.jar.
2 ответа
Вы должны были бы написать загрузчик классов, который мог бы иметь дело с "банками в банках". Это звучит как довольно плохая идея для меня.
Не объединяйте файлы jar - просто храните их отдельно на диске. Я понимаю, что вам, возможно, придется убедить руководство в необходимости иметь больше файлов, но это действительно сделает все намного проще. Написание загрузчика классов нетривиально...
Может быть, я не правильно понимаю, но я верю, что вы хотите, чтобы выполнить вашу программу с другим файлом JAR (также) на вашем пути к классам.
Допустим, у вас есть ядро в A.jar и библиотека в B.jar. Вы можете выполнить вашу программу следующим образом (замените: на; в Windows):
java -cp A.jar:B.jar main.class.Name args
куда main.class.Name
ваше имя основного класса, и args
это где все ваши аргументы командной строки идет.
Вы также можете положить Main-Class
а также Class-Path
атрибут в вашем manifest.mf
как это:
Class-Path: B.jar
Main-Class: main.class.Name
Затем вы можете выполнить программу следующим образом:
java -jar A.jar args
Честно говоря, я привык думать, что это было просто - распространять мое приложение в виде одного файла JAR со всеми зависимостями, извлеченными и обернутыми в один гигантский файл JAR. Проблема в том, что некоторые приложения имеют довольно много зависимостей, и каждый раз, когда я вносил изменения в свой код, это также означало, что мне приходилось распространять весь зависимый код, даже если ничего в зависимостях не изменилось. Это означало распространение гигантских файлов JAR, даже если изменения были незначительными.
Используя Class-Path
атрибут manifest, я могу распространять приложения, которые могут быть выполнены точно так же, как один файл JAR (двойной щелчок в некоторых системах или простоjava -jar
"заклинание), но сэкономить массу времени и пропускной способности, не передавая все дубликаты библиотек с последующими выпусками программного обеспечения.
Также возможно поместить любые зависимые JAR в их собственный каталог (давайте назовем это lib
на данный момент) и изменить Class-Path
так что все пути JAR выглядят какlib/B.jar
Msgstr "Тогда у вас не будет каталога основной программы, заполненного множеством крошечных JAR-файлов.