Могу ли я вызвать файлы классов, которые находятся в библиотеке 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.jarMsgstr "Тогда у вас не будет каталога основной программы, заполненного множеством крошечных JAR-файлов.

Другие вопросы по тегам