Подтвердить что ты не робот

Справочные банки в банке

У меня есть банка, содержимое которой выглядит, как показано ниже,

enter image description here

Ниже представлен файл манифеста

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.3
Created-By: 1.7.0_06-b24 (Oracle Corporation)
Main-Class: org.sai.com.DerbyDemo
Class-Path: derby.jar derbyclient.jar derbynet.jar derbytools.jar

Когда я пытаюсь запустить банку, она выбрала ClassNotFoundExcception, что означает, что она не ссылается на банки внутри внешней банки.

В атрибуте Class-Path, как я могу ссылаться на банки (derby.jar и т.д.) внутри фактического jar?

4b9b3361

Ответ 1

Для этого вам понадобится специальный загрузчик классов, посмотрите One Jar.

One-JAR позволяет вам упаковать Java-приложение вместе с его банками зависимости в один исполняемый файл Jar.

У него есть задача ant, которая также упрощает ее создание.

ССЫЛКА (из background)

Большинство разработчиков разумно предполагают, что включение JAR файла зависимости в свой собственный Jar файл и добавление атрибута Class-Path в META-INF/MANIFEST сделает трюк:


jarname.jar
| /META-INF
| |  MANIFEST.MF
| |    Main-Class: com.mydomain.mypackage.Main
| |    Class-Path: commons-logging.jar
| /com/mydomain/mypackage
| |  Main.class
| commons-logging.jar

К сожалению, это не работает. Java Launcher$AppClassLoader не знает, как загружать классы из Jar внутри Jar с помощью такого типа Class-Path. Попытка использовать jar:file:jarname.jar!/commons-logging.jar также ведет к тупику. Этот подход будет работать, только если вы установите (то есть разброс) поддерживающие файлы Jar в каталог, где установлен файл jarname.jar.

Ответ 2

Вы не можете. Из официального официального учебника:

Используя заголовок Class-Path в манифесте, вы можете избежать указать флаг long -classpath при вызове Java для запуска вашего приложение.

Примечание. Заголовок Class-Path указывает на классы или файлы JAR на локальная сеть, а не файлы JAR в файле JAR или доступные классы через интернет-протоколы. Загрузка классов в JAR файлы в JAR файл в путь к классу, вы должны написать собственный код для загрузки этих классы. Например, если MyJar.jar содержит другой JAR файл, называемый MyUtils.jar, вы не можете использовать заголовок Class-Path в MyJar.jar's манифест для загрузки классов в MyUtils.jar в путь к классу.

Ответ 3

В Eclipse у вас есть возможность экспортировать исполняемую банку. enter image description here У вас есть возможность упаковать все связанные с проектом банки в сгенерированную банку, и таким образом eclipse добавит пользовательский загрузчик классов, который будет ссылаться на ваши встроенные банки в новой банке.

enter image description here

Ответ 4

Стандартные реализации загрузчика классов не могут загружаться из jar-in-a-jar: для этого весь "суб-jar" должен быть загружен в память, что наносит ущерб преимуществам произвольного доступа jar format (ссылка ожидается - я сделаю редактирование, как только найду документацию, подтверждающую это).

Я рекомендую использовать такую ​​программу, как JarSplice, чтобы объединить все для вас в одну чистую исполняемую банку.

Изменить: Не удалось найти ссылку на источник, но здесь не разрешен RFE с веб-сайта Sun, описывающий эту "проблему": http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4648386

Кроме того, вы можете "проверить", что ваша программа работает, поместив файлы библиотеки jar в подкаталог \lib вашего каталога classes, а затем запустив его из командной строки. Другими словами, со следующей структурой каталогов:

classes/org/sai/com/DerbyDemo.class
classes/org/sai/com/OtherClassFiles.class
classes/lib/derby.jar
classes/lib/derbyclient.jar

В командной строке перейдите в вышеупомянутый каталог "classes" и введите:

java -cp .:lib/* org.sai.com.DerbyDemo

Ответ 5

Добавьте файлы jar в свою библиотеку (при использовании netbeans) и измените файл манифеста classpath следующим образом:

Class-Path: lib/derby.jar lib/derbyclient.jar lib/derbynet.jar lib/derbytools.jar

аналогичный ответ существует здесь

Ответ 6

в проекте eclipse, щелкните правой кнопкой мыши проект, выберите RunAs → Запустить конфигурацию и сохраните конфигурацию запуска, это будет использоваться при следующем экспорте в качестве Runnable JARs