Справочные банки в банке
У меня есть банка, содержимое которой выглядит, как показано ниже,
![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?
Ответы
Ответ 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 у вас есть возможность экспортировать исполняемую банку.
У вас есть возможность упаковать все связанные с проектом банки в сгенерированную банку, и таким образом 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