Как совместить библиотеку с моей банкой? - PullRequest
4 голосов
/ 07 января 2010

Хорошо, поэтому я написал программу, которая использует стороннюю библиотеку с открытым исходным кодом, и я хочу упаковать ее с моей программой в один jar. Я использую NetBeans 6.8, и все, что я пробовал, Java всегда выдает ошибку:

java.lang.NoClassDefFoundError: libraryname;

не по теме : также я хотел бы знать, как сделать исполняемый jar (exe) через netbeans, если это возможно. (Я видел программы, которые были написаны на Java, но были .exe)

EDIT обнаружил плагин для затмения под названием FatJar, который может делать то, что я хочу, но я не могу найти что-то похожее для netbeans, есть ли такое?

Ответы [ 8 ]

16 голосов
/ 07 января 2010

Я начну с обязательного отказа от ответственности: Исполняемые файлы JAR Java не работают таким образом. Исполняемый файл JAR имеет основной класс, определенный в файле MANIFEST.MF JAR, и MANIFEST также позволяет определение пути к классу для включения библиотек, которые понадобятся коду в исполняемом JAR. Определение пути к классу в MANIFEST должно перечислять каждый JAR или папку для помещения в путь к классу, относительные пути относятся к расположению исполняемого JAR, а не к путям, содержащимся внутри исполняемого JAR. Исполняемые файлы JAR запускаются с аргументом "-jar" для исполняемого файла java, а флаг java "-cp" и переменная среды CLASSPATH игнорируются . Что касается того, почему исполняемые JAR-файлы были разработаны таким образом, вы должны знать о главном недостатке загрузки классов из JAR-файлов, содержащихся в JAR-файлах, даже если остальная часть этого ответа будет сосредоточена именно на этом.

ПРИМЕЧАНИЕ. Я потерял оригинальную тему на форуме Sun, которая полностью его объяснила, но, по сути, это связано с тем, что записи в JAR верхнего уровня могут читаться в режиме произвольного доступа, но весь встроенный JAR должен быть прочитан до того, как записи могут быть доступны, потому что JAR верхнего уровня мог сжать свои записи.

В прошлом я успешно использовал One-Jar , но структура окончательного полученного кувшина может не соответствовать вашим ожиданиям. По сути, классы One-Jar являются единственными не-JARd классами в последнем jar; весь остальной код (ваш код и любой зависимый код библиотеки) включается в получившийся JAR как файл JAR. Ваше приложение JARed как обычный файл JAR с именем "main.jar" в "главной" папке окончательного JAR. Любые библиотеки, в которых нуждается ваш код, помещаются в виде файлов JAR в конечную папку "lib" JAR. И последний, но не менее важный файл MANIFEST.MF JAR сообщает One-Jar, какой у вас основной класс. Выполнение - это просто "java -jar final.jar [аргументы вашего приложения]". Я не знаю, как сделать следующий шаг по конвертации в OS-native-EXE относительно вашего вопроса, не относящегося к теме, но, вероятно, было бы лучше использовать механизм упаковки, отличный от One-Jar. Я не уверен, как это сделать с NetBeans, мой совет - использовать инструмент для сборки, чтобы упаковать финальную флягу. К счастью, One-Jar предоставляет инструкции по созданию окончательного JAR-файла с помощью Ant, и его легко интегрировать в NetBeans.

Я полагаю, что плагин Eclipse FatJar создает исполняемый JAR One-Jar, поэтому, если этот плагин, кажется, делает то, что вы хотите, то One-Jar - способ сделать это. Лично я использовал сборку Maven.

Существует предостережение - любые подписанные библиотеки, которые требуют (или желают) воспользоваться подписанной проверкой JAR Java, могут не работать таким образом - реализации Java Cryptographic Extension (JCE), такие как BouncyCastle, являются ярким примером. Я думаю, что причина в том, что проверка подписи выполняется против окончательного JAR, а не подписанной библиотеки. К счастью, One-Jar позволяет конечному пользователю добавлять дополнительные библиотеки в путь к классам, что явно исключается при запуске исполняемого JAR; Чтобы обойти это, вам лучше поставить проблемные JAR с окончательным JAR и зависящим от ОС сценарием запуска (.bat, .sh и т. д.).

4 голосов
/ 07 января 2010

Мой общий ответ на ваш не по теме вопрос (довольно длинная) статья: Преобразование Java в EXE - почему, когда, когда нет и как . Там много ссылок на бесплатные и коммерческие инструменты, но я никогда не видел плагин Netbeans с такой функциональностью, извините.

4 голосов
/ 07 января 2010

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

Поместите свой код в банку (я назову его app.jar) вместе с META-INF/MANIFEST.MF файлом с такими записями:

Main-Class: com.y.app.AppMain
Class-path: third-party.jar blort.jar foo.jar

Затем вы можете выбросить все банки в каталог и запустить AppMain следующим образом:

java -jar app.jar

Если вы хотите, вы можете поместить сторонние библиотеки в один каталог, например lib, и ссылаться на них в атрибуте Class-path, используя путь относительно основного фляги: lib/third-party.jar аккуратный.

3 голосов
/ 07 января 2010

Чтобы добавить еще одну банку в свой сосуд, вам может пригодиться jarjar .

У исполняемых jar-файлов просто есть класс, определенный как 'Main', если я не ошибаюсь. Это может быть полезно .

2 голосов
/ 11 января 2011

Это было отличное руководство, и я действительно сделал то, что хотел, без всяких неприятностей во всех этих сторонних библиотеках.

http://java.sun.com/developer/technicalArticles/java_warehouse/single_jar/

1 голос
/ 07 января 2010

Если нет необходимости переупаковывать сторонние банки в ваш последний большой сосуд, то этот должен быть самым простым способом.

0 голосов
/ 23 декабря 2015

если вы используете MAVEN, используйте плагин "maven-shade-plugin". Он скомпилирует jar со всеми зависимостями (сторонние и т. Д.)

0 голосов
/ 07 января 2010

Если нет licencing issues, то наиболее предпочтительным способом является разархивировать саму флягу и перефразировать ее с вашими файлами классов, в новую банку.

Вы можете просто использовать jar cmd для этого, ничего страшного !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...