2009-08-11 3 views
3

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

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

This is not the thing I want to do :)

+0

Вы хотите сказать, что у вас есть кувшин, содержащий другие банки? Или что вы хотите включить в свою банку зависшие банки? в чем именно проблема?: – djna

+0

Я обновил вопрос :) –

ответ

6

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

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

+0

+1 для вызова «банки в баночках» плохая идея. –

1

Возможно, я неправильно понимаю, но я считаю, что вы хотите выполнить свою программу с другим 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»), но сэкономить массу времени и полосы пропускания, не передавая все дубликаты библиотек с последующими выпусками программного обеспечения.

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

+0

Проблема в том, что OP имеет один файл jar * внутри * другой файл jar. –

+0

Я полагаю, что это становится более понятным, перечитывая название вопроса, но определенно не из самого вопроса. –

+0

Я обновляю вопрос :) –