Можно ли указать Java, classpath
который включает файл JAR, содержащийся в другом файле JAR?
134
Если вы пытаетесь создать один jar-файл, содержащий ваше приложение и необходимые библиотеки, есть два способа (которые я знаю) сделать это. Первый - One-Jar , который использует специальный загрузчик классов, чтобы разрешить вложение jar. Вторым является UberJar , (или Shade ), который взрывает включенные библиотеки и помещает все классы в jar верхнего уровня.
Я должен также упомянуть, что UberJar и Shade являются плагинами для Maven1 и Maven2 соответственно. Как упомянуто ниже, вы также можете использовать плагин сборки (который на самом деле гораздо мощнее, но гораздо сложнее правильно настроить).
Вы НЕ хотите использовать эти решения для "взрыва содержимого JAR". Они определенно мешают видеть вещи (так как все взорвано на одном уровне). Кроме того, могут быть конфликты имен (не должно происходить, если люди используют надлежащие пакеты, но вы не всегда можете это контролировать).
Функция, которую вы хотите, - это один из 25 лучших RFE Sun : RFE 4648386 , который Sun в своей бесконечной мудрости определила как имеющий низкий приоритет. Мы можем только надеяться, что Солнце проснется ...
Между тем, лучшее решение, с которым я столкнулся (которое я хотел бы, чтобы Sun копировал в JDK), - это использование пользовательского загрузчика классов JarClassLoader .
источник
activation.jar
).После некоторых исследований я нашел метод, который не требует maven или какого-либо стороннего расширения / программы.
Вы можете использовать «Class-Path» в вашем файле манифеста.
Например:
Создать файл манифеста MANIFEST.MF
Скомпилируйте все ваши классы и запустите
jar cfm Testing.jar MANIFEST.MF *.class custom_lib.jar
c
обозначает создание архиваf
указывает, что вы хотите указать файлv
для подробного вводаm
означает, что мы передадим пользовательский файл манифеста.Убедитесь, что вы включили lib в пакет jar. Вы должны быть в состоянии запустить банку в обычном режиме.
основанный на: http://www.ibm.com/developerworks/library/j-5things6/
всю остальную информацию, необходимую вам о пути к классам, вы найдете здесь
источник
custom_lib.jar
отошел, банку больше нельзя выполнять :(Используйте тег zipgroupfileset (использует те же атрибуты, что и тег fileset ); он распакует все файлы в каталоге и добавит в ваш новый файл архива. Больше информации: http://ant.apache.org/manual/Tasks/zip.html
Это очень полезный способ обойти проблему jar-in-a-jar - я знаю, потому что я нашел этот точный вопрос StackOverflow, пытаясь понять, что делать. Если вы хотите упаковать jar или папку jar в ваш собранный jar с Ant, забудьте обо всем этом, что касается classpath или сторонних плагинов, все, что вам нужно сделать, это (в Ant):
источник
Если вы строите с помощью ant (я использую ant из eclipse), вы можете просто добавить дополнительные jar-файлы, сказав ant для добавления их ... Не обязательно лучший метод, если у вас есть проект, поддерживаемый несколькими людьми, но он работает для одного человека проект и легко.
например, моя цель, которая строила файл .jar:
Я просто добавил одну строку, чтобы сделать это:
где
был реж с наружными банками. И это все...
источник
Не без написания собственного загрузчика классов. Вы можете добавить банки в путь к классу банки, но они должны быть расположены рядом, а не в основной банке.
источник
Вам нужно создать собственный загрузчик классов или стороннюю библиотеку, которая это поддерживает. Лучше всего извлечь банку из среды выполнения и добавить их в путь к классам (или уже добавить их в путь к классам).
источник
Я использую maven для моих сборок java, в которых есть плагин под названием плагин сборки maven .
Это делает то, что вы просите, но, как и некоторые другие предложения, описывают - по сути, взорвать все зависимые банки и объединить их в одну банку
источник
Если у вас есть eclpise IDE, вам просто нужно экспортировать JAR и выбрать «Пакет Обязательные библиотеки в сгенерированный JAR». eclipse автоматически добавит требуемые зависимые JAR-файлы в сгенерированный JAR-файл, а также сгенерирует некоторый загрузчик пользовательских классов eclipse, который автоматически загружает эти JAR-файлы.
источник
Я собирался посоветовать извлечь все файлы на одном уровне, а затем сделать из этого банку, так как система пакетов должна держать их аккуратно разделенными. Это было бы ручным способом, я полагаю, что инструменты, указанные Стивом, сделают это хорошо.
источник
Уинстон довольно хорош http://blog.jayway.com/2008/11/28/executable-war-with-winstone-maven-plugin/ . Но не для сложных сайтов. И это позор, потому что все, что нужно, это включить плагин.
источник
Ну, есть очень простой способ, если вы используете Eclipse.
Экспортируйте ваш проект в виде файла Jar «Runnable» (щелкните правой кнопкой мыши папку проекта в Eclipse, выберите «Export ...»). При настройке параметров экспорта обязательно выберите «Извлечь необходимые библиотеки в сгенерированный Jar». Имейте в виду, выберите «Извлечь ...» и не «Пакет обязательных библиотек ...».
Дополнительно : вы должны выбрать конфигурацию запуска в настройках экспорта. Таким образом, вы всегда можете создать пустой main () в некотором классе и использовать его для конфигурации своего запуска.
В любом случае, он не гарантированно будет работать 100% времени - так как вы заметите всплывающее сообщение, в котором вам будет сказано убедиться, что вы проверяете лицензии на файлы Jar, которые вы включаете, и что-то не копировать файлы подписи. Тем не менее, я делал это годами и никогда не сталкивался с проблемой.
источник
Извлечение в Uber-dir работает для меня, так как мы все должны использовать root: \ java и иметь выходной код в пакетах с версиями. Т.е. ca.tecreations-1.0.0. Подписание в порядке, потому что банки не повреждены из их загруженного местоположения. Сторонние подписи не повреждены, извлеките их в c: \ java. Там мой проект реж. запустить из панели запуска, так что java -cp c: \ java Launcher
источник