Могу ли я вызвать файлы классов, которые находятся в библиотеке jar, расположенной в другом файле jar? - PullRequest
3 голосов
/ 11 августа 2009

Я пытаюсь получить доступ к файлам классов, упакованным как библиотека, но, к сожалению, библиотеки jar должны быть упакованы в другой файл jar.

В качестве примера скажем, что у меня есть .jar, который содержит некоторые библиотеки классов. Я могу вызывать (импортировать) классы в jar-файле из моего внешнего java-приложения. Теперь мне нужно поместить этот a.jar в другой jar, скажем, b.jar, и мне нужен доступ (импортировать) классы в a.jar извне b.jar.

Это не то, что я хочу сделать:)

Ответы [ 2 ]

6 голосов
/ 11 августа 2009

Вы должны были бы написать загрузчик классов, который мог бы иметь дело с «банками внутри банок». Это звучит как довольно плохая идея для меня.

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

1 голос
/ 11 августа 2009

Возможно, я не правильно понимаю, но я верю, что вам нужно выполнить вашу программу с другим файлом 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, я могу распространять приложения, которые могут быть выполнены точно так же, как один файл JAR (двойной щелчок в некоторых системах или простое заклинание "java -jar"), но сохранить тонна времени и пропускной способности, поскольку не переносятся все дубликаты библиотек с последующими выпусками программного обеспечения.

Также можно поместить любые зависимые JAR-файлы в их собственный каталог (на данный момент давайте назовем его lib) и изменить Class-Path так, чтобы все пути JAR выглядели как "lib/B.jar". Тогда у вас не будет основного каталога программ, заполненного множеством крошечных JAR-файлов.

...