Я начну с обязательного отказа от ответственности: Исполняемые файлы 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 и т. д.).