Classpath включая JAR внутри JAR



можно ли указать Java classpath Что включает в себя файл JAR, содержащийся в другом файле JAR?

589   12  

12 ответов:

Если вы пытаетесь создать одну банку, которая содержит ваше приложение, и это необходимые библиотеки, есть два способа (которые я знаю), чтобы сделать это. Первый - это One-Jar, который использует специальный загрузчик классов, чтобы разрешить вложение банки. Второй - это UberJar (или тени), который взрывает включенные библиотеки и помещает все классы в банку верхнего уровня.

Я должен также упомянуть, что UberJar и Shade являются плагинами для Maven1 и Maven2 соответственно. Как уже упоминалось ниже, вы также можете использовать плагин сборки (который на самом деле намного мощнее, но гораздо сложнее правильно настроить).

вы не хотите использовать эти решения "взорвать содержимое банки". Они определенно затрудняют просмотр материала (так как все взрывается на одном уровне). Кроме того, могут возникнуть конфликты именования (не должно происходить, если люди используют правильные пакеты, но вы не всегда можете это контролировать).

функция, которую вы хотите, является одним из top 25 Sun RFEs:RFE 4648386, которое Солнце в своей бесконечной мудрости определило как низкоприоритетное. Остается только надеяться, что Солнце проснется...

тем временем, лучшее решение, с которым я столкнулся (которое я хотел бы, чтобы Sun скопировал в JDK), - это использовать пользовательский загрузчик классов JarClassLoader.

после некоторых исследований я нашел метод, который не требует maven или любого стороннего расширения/программы.

вы можете использовать "Class-Path" в файле манифеста.

например:

создать манифест файла манифеста.МФ

Manifest-Version: 1.0
Created-By: Bundle
Class-Path: ./custom_lib.jar
Main-Class: YourMainClass

скомпилируйте все свои классы и запустите jar cfm Testing.jar MANIFEST.MF *.class custom_lib.jar

c расшифровывается как создать архив f указывает на то, что вы хотите указать файл v для подробного ввода m означает, что мы будем проходить пользовательский файл манифеста

убедитесь, что вы включили lib в пакет jar. Вы должны быть в состоянии запустить Jar в обычном режиме.

на основе:http://www.ibm.com/developerworks/library/j-5things6/

вся другая информация вам нужна о class-path вы находите здесь

использовать zipgroupfileset tag (использует те же атрибуты, что и файлы tag); он распакует все файлы в каталоге и добавит в ваш новый архивный файл. Дополнительная информация: http://ant.apache.org/manual/Tasks/zip.html

Это очень полезный способ обойти проблему jar-in-a-jar-я знаю, потому что я погуглил этот точный вопрос StackOverflow, пытаясь выяснить, что делать. Если вы хотите упаковать банку или папку банки в один встроенный банку с Ant, а затем забыть обо всех этих classpath или сторонних плагинов вещи, все, что вам нужно сделать, это (в Ant):

<jar destfile="your.jar" basedir="java/dir">
  ...
  <zipgroupfileset dir="dir/of/jars" />
</jar>

Если вы строите с ant (я использую ant от eclipse), вы можете просто добавить дополнительные файлы jar сказал Муравей, чтобы добавить их... Не обязательно лучший метод, если у вас есть проект, поддерживаемый несколькими людьми, но он работает для одного человека проекта и легко.

например, моя цель была здание .файл jar был:

<jar destfile="${plugin.jar}" basedir="${plugin.build.dir}">
    <manifest>
        <attribute name="Author" value="ntg"/>
        ................................
        <attribute name="Plugin-Version" value="${version.entry.commit.revision}"/>
    </manifest>
</jar>

Я просто добавил одну строку, чтобы сделать это:

<jar ....">
    <zipgroupfileset dir="${external-lib-dir}" includes="*.jar"/>
    <manifest>
        ................................
    </manifest>
</jar>

здесь

<property name="external-lib-dir" value="C:\...\eclipseWorkspace\Filter\external\...\lib" />

был dir с внешней банки. И это все...

Не без написания собственного загрузчика классов. Вы можете добавить банки в путь к классам jar, но они должны быть совместно расположены, а не содержаться в основной банке.

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

Я использую maven для моих Java-сборок, которые имеют плагин под названием плагин сборки maven.

Он делает то, что вы просите, но, как и некоторые другие предложения, описывают - по существу, взрывая все зависимые банки и рекомбинируя их в одну банку

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

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

Уинстон довольно хорош http://blog.jayway.com/2008/11/28/executable-war-with-winstone-maven-plugin/. но не для сложных сайтов. И это позор, потому что все, что нужно, это включить плагин.

Ну, есть очень простой способ, если вы используете Eclipse.

экспортируйте свой проект как "запускаемый" файл Jar (щелкните правой кнопкой мыши папку проекта из Eclipse, выберите "Экспорт..."). При настройке параметров экспорта обязательно выберите " извлечь необходимые библиотеки в сгенерированную банку."Имейте в виду, выберите "извлечь..."и не " пакет необходимых библиотек...".

дополнительно: необходимо выбрать конфигурацию запуска в экспорте настройки. Поэтому, вы всегда можете создать пустой main( ) в некотором классе и использовать его для вашей конфигурации запуска.

во всяком случае, это не гарантированный для работы в 100% случаев - как вы заметите всплывающее сообщение о том, чтобы убедиться, что вы проверяете лицензии файлов Jar, которые вы включаете, и что-то о том, чтобы не копировать файлы подписи. Тем не менее, я делаю это для лет и никогда не сталкивался с проблемой.

Comments

    Ничего не найдено.