Мога ли да извикам клас файлове, които са в рамките на jar библиотека, разположена в друг jar файл?

Опитвам се да осъществя достъп до клас файловете, пакетирани като библиотека, но за съжаление библиотеките от буркан трябва да бъдат пакетирани в друг файл от буркан.

Като пример кажете, че имам a.jar, който съдържа някои библиотеки от класове. Мога да извикам (импортирам) класовете в jar файла от моето външно java приложение. Сега трябва да поставя този a.jar в друг буркан, да речем b.jar и трябва да осъществя достъп (импортиране) на класовете в a.jar извън b.jar.

Това не е нещото, което искам да направя: )


person Chathuranga Chandrasekara    schedule 11.08.2009    source източник
comment
Искате да кажете, че копаете буркан, който съдържа други буркани? Или че искате да включите зависими буркани във вашия буркан? Какъв точно е проблемът?   -  person djna    schedule 11.08.2009


Отговори (2)


Ще трябва да напишете програма за зареждане на класове, която може да се справи с "буркани в буркани". Това ми звучи като доста лоша идея.

Не обединявайте jar файловете - просто ги съхранявайте отделно на диска. Осъзнавам, че може да се наложи да убедите ръководството в необходимостта да имате повече файлове, но това наистина ще направи всичко много по-лесно. Писането на програма за зареждане на класове е нетривиално...

person Jon Skeet    schedule 11.08.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 файлове.

person Adam Batkin    schedule 11.08.2009
comment
Проблемът е, че OP има един jar файл вътре в друг jar файл. - person Jon Skeet; 11.08.2009
comment
Предполагам, че става по-ясно, като препрочетем заглавието на въпроса, но определено не от самия текст на въпроса - person Adam Batkin; 11.08.2009