Самый простой способ объединить выпуск в один JAR-файл

Есть ли инструмент или сценарий, который легко объединяет кучу файлов БАНКА в один файл JAR? Бонусом было бы легко установить манифест главного файла и сделать его исполняемым.

Конкретный случай - Инструмент для реструктуризации текста Java. Я хотел бы запустить его примерно так:

java -jar rst.jar

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

      0  11-30-07 10:01   jrst-0.8.1/
    922  11-30-07 09:53   jrst-0.8.1/jrst.bat
    898  11-30-07 09:53   jrst-0.8.1/jrst.sh
   2675  11-30-07 09:42   jrst-0.8.1/readmeEN.txt
 108821  11-30-07 09:59   jrst-0.8.1/jrst-0.8.1.jar
   2675  11-30-07 09:42   jrst-0.8.1/readme.txt
      0  11-30-07 10:01   jrst-0.8.1/lib/
  81508  11-30-07 09:49   jrst-0.8.1/lib/batik-util-1.6-1.jar
2450757  11-30-07 09:49   jrst-0.8.1/lib/icu4j-2.6.1.jar
 559366  11-30-07 09:49   jrst-0.8.1/lib/commons-collections-3.1.jar
  83613  11-30-07 09:49   jrst-0.8.1/lib/commons-io-1.3.1.jar
 207723  11-30-07 09:49   jrst-0.8.1/lib/commons-lang-2.1.jar
  52915  11-30-07 09:49   jrst-0.8.1/lib/commons-logging-1.1.jar
 260172  11-30-07 09:49   jrst-0.8.1/lib/commons-primitives-1.0.jar
 313898  11-30-07 09:49   jrst-0.8.1/lib/dom4j-1.6.1.jar
1994150  11-30-07 09:49   jrst-0.8.1/lib/fop-0.93-jdk15.jar
  55147  11-30-07 09:49   jrst-0.8.1/lib/activation-1.0.2.jar
 355030  11-30-07 09:49   jrst-0.8.1/lib/mail-1.3.3.jar
  77977  11-30-07 09:49   jrst-0.8.1/lib/servlet-api-2.3.jar
 226915  11-30-07 09:49   jrst-0.8.1/lib/jaxen-1.1.1.jar
 153253  11-30-07 09:49   jrst-0.8.1/lib/jdom-1.0.jar
  50789  11-30-07 09:49   jrst-0.8.1/lib/jewelcli-0.41.jar
 324952  11-30-07 09:49   jrst-0.8.1/lib/looks-1.2.2.jar
 121070  11-30-07 09:49   jrst-0.8.1/lib/junit-3.8.1.jar
 358085  11-30-07 09:49   jrst-0.8.1/lib/log4j-1.2.12.jar
  72150  11-30-07 09:49   jrst-0.8.1/lib/logkit-1.0.1.jar
 342897  11-30-07 09:49   jrst-0.8.1/lib/lutinwidget-0.9.jar
2160934  11-30-07 09:49   jrst-0.8.1/lib/docbook-xsl-nwalsh-1.71.1.jar
 301249  11-30-07 09:49   jrst-0.8.1/lib/xmlgraphics-commons-1.1.jar
  68610  11-30-07 09:49   jrst-0.8.1/lib/sdoc-0.5.0-beta.jar
3149655  11-30-07 09:49   jrst-0.8.1/lib/xalan-2.6.0.jar
1010675  11-30-07 09:49   jrst-0.8.1/lib/xercesImpl-2.6.2.jar
 194205  11-30-07 09:49   jrst-0.8.1/lib/xml-apis-1.3.02.jar
  78440  11-30-07 09:49   jrst-0.8.1/lib/xmlParserAPIs-2.0.2.jar
  86249  11-30-07 09:49   jrst-0.8.1/lib/xmlunit-1.1.jar
 108874  11-30-07 09:49   jrst-0.8.1/lib/xom-1.0.jar
  63966  11-30-07 09:49   jrst-0.8.1/lib/avalon-framework-4.1.3.jar
 138228  11-30-07 09:49   jrst-0.8.1/lib/batik-gui-util-1.6-1.jar
 216394  11-30-07 09:49   jrst-0.8.1/lib/l2fprod-common-0.1.jar
 121689  11-30-07 09:49   jrst-0.8.1/lib/lutinutil-0.26.jar
  76687  11-30-07 09:49   jrst-0.8.1/lib/batik-ext-1.6-1.jar
 124724  11-30-07 09:49   jrst-0.8.1/lib/xmlParserAPIs-2.6.2.jar

Как видите, желательно не делать это вручную.

До сих пор я пробовал только AutoJar и ProGuard, которые довольно легко запустить. Похоже, что есть проблема с постоянным пулом в файлах JAR.

По-видимому, jrst немного сломан, поэтому я исправлю его. Файл Mavenpom.xml, по-видимому, тоже был поврежден, поэтому мне придется исправить это, прежде чем исправлять jrst ... Я чувствую себя магнитом для ошибок :-)


Обновление: я так и не успел починить это приложение, но я проверил Затмение «Мастер экспорта Runnable JAR», который основан на толстом JAR. Я нашел это очень простым в использовании для развертывания собственного кода.

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

jdotsoft.com/JarClassLoader.php
gorokhmn 02.03.2010 17:05
Плагин Fat Jar Eclipse
Stephen Denne 17.09.2008 13:07
Одна банка
Stephen Denne 17.09.2008 13:04
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
74
3
77 874
13
Перейти к ответу Данный вопрос помечен как решенный

Ответы 13

Если вы являетесь пользователем Maven, обычно плагин сборки делает то, что вы хотите, или, возможно, плагин тени, а в некоторых случаях их комбинация.

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

mvn assembly:assembly

Или, если у вас есть более особые дела, одна из других целей. Все включаемые файлы JAR выбираются преобразователем зависимостей Maven. Если вы используете плагин тени, это обычно является частью цели установки, и в одном конкретном проекте, над которым я работаю сейчас, я использую

mvn install
mvn assembly:single

Цель assembly:single - обойти проблемы времени жизни, в данном случае в приложении Spring.

Похоже, что Apache Ant - это то, что вы ищете.

Существует инструмент под названием автокожа, который сканирует ваш байт-код и компилирует файл .jar с найденными классами, включая ссылочные (импортированные) классы.

Однако не всегда работает с чем-то вроде Spring, где вы указываете имена классов в конфигурации, и они загружаются фреймворком.

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

tovare 17.09.2008 17:31
Ответ принят как подходящий

Eclipse 3.4 JDT's Runnable JAR-мастер экспорта.

В Eclipse 3.5 это было расширено. Теперь вы можете выбрать, как вы хотите обращаться с вашими ссылочными JAR-файлами.

Не могли бы вы проверить, можно ли использовать созданные ant-скрипты? Ранее возникла проблема с абсолютными путями к файлам вместо относительных.

Thorbjørn Ravn Andersen 28.11.2009 13:06

Попробовав несколько различных решений, я обнаружил, что с One-JAR проще всего работать, и мне удалось сделать именно это: создать один исполняемый файл JAR, содержащий все, что мне нужно.

One-JAR использует собственный загрузчик классов, который может перемещаться по вложенным ресурсам. Посмотрите на файл .bat в загружаемом файле, он выглядит как org.codelutin.jrst.JRST в jrst-0.8.1.jar является основным классом, поэтому ваш манифест должен выглядеть так:

Main-Class: com.simontuffs.onejar.Boot
One-Jar-Main-Class: org.codelutin.jrst.JRST

По-настоящему круто то, что One-JAR будет обрабатывать передачу аргументов командной строки за вас. Путь к классам обрабатывается пользовательским загрузчиком классов, предполагая, что все необходимые ресурсы объединены в один JAR.

Самый простой способ использовать One-JAR - использовать ant; есть специальная задача для муравьев "one-jar", которая работает следующим образом (при условии, что ваш манифест называется "rst.mf"):

<target name = "jar-rst">
    <one-jar destfile = "rst.jar" manifest = "rst.mf">
        <main jar = "jrst-0.8.1.jar" />
        <lib>
            <fileset dir = "${pathToJars}">
                <include name = "batik-util-1.6-1.jar" />
                <include name = "icu4j-2.6.1.jar" />
                <include name = "commons-collections-3.1.jar" />
                <!-- Snip -->
            </fileset>
        </lib>
    </one-jar>
</target>

Возможность использования сценариев one-jar с ant делает его пригодным для использования в системах непрерывной сборки.

Thorbjørn Ravn Andersen 28.11.2009 13:07

1. Можно ли использовать One-JAR, если в моем jar-файле есть несколько приложений (несколько классов точек входа)? 2. Что, если этот jar-файл используется другим приложением, может ли оно также использовать классы во вложенных jar-файлах внутри «One-JAR»?

MRalwasser 02.05.2012 14:09

Существует ProGuard, который не только упаковывает ваши файлы JAR в один, но также может оптимизировать, очищать или скрывать ваши файлы классов, делая итоговый файл JAR намного меньше, чем сумма всех файлов JAR до этого.

Я действительно пробовал ProGuard с инструментом JRST, и все именно так, как вы сообщили. Я попытался отследить проблему и обнаружил, что она связана с Жук в библиотеке ICU4J, на которую ссылается jrst. Проблема в том, что используемая версия ICU сейчас сильно устарела. Поэтому я заменил файл icu.jar на ICU4J версии 3.2. Теперь ProGuard находит кучу других ошибок / предупреждений о несоответствиях с библиотеками JRST.

Я предполагаю, что ProGuard работает так, как ожидалось, но библиотеки jrst просто несовместимы. Я не знаю, можете ли вы сделать намного больше, чем поговорить с его разработчиками, поскольку они должны проверять и обновлять зависимости проекта.

Спасибо! Я скачал его и попробовал, но в этом конкретном поле он бомбил неизвестным постоянным полем на icu4j-2.6.1.jar,

tovare 17.09.2008 14:36

Или с помощью плагина сборки Maven (mvn assembly: assembly)

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

zipfileset от Ant делает свою работу

<jar id = "files" jarfile = "all.jar">
    <zipfileset src = "first.jar" includes = "**/*.java **/*.class"/>
    <zipfileset src = "second.jar" includes = "**/*.java **/*.class"/>
</jar>

+1, так как это также позволяет добавлять теги <manifest /> и устанавливать основной класс.

Shirkrin 31.05.2012 14:47

Можно ли как-нибудь сделать это для всех файлов jar в каталоге. Было бы очень аккуратно. Избегайте необходимости обновлять build.xml при изменении библиотек.

Frans Lundberg 12.11.2013 17:57

Попробуйте этот подход, вам не придется беспокоиться о добавлении новых банок: github.com/anupamsaini/Trie/blob/master/src/build.xml#L42

Anupam Saini 02.12.2013 09:13

One-JAR 0.97 только что был выпущен на http://one-jar.sourceforge.net, и он был расширен за счет поддержки таких фреймворков, как Spring и Guice, что может создать проблемы для других подходов. Он также обрабатывает инверсию загрузчика классов - где некоторые файлы JAR являются внешними по отношению к One-JAR (например, драйверы JDBC, которые могут не поставляться в комплекте).

One-JAR - это командная строка с плагинами Муравей и Maven 2. Его также просто построить, просто используя инструмент «jar».

Я также могу порекомендовать Eclipse Jar Exporter (Runnable), о котором писал Ференс Хехлер: он проделал огромную работу, придумав простой подход к упаковке набора файлов JAR. Мы с ним работали над One-JAR, но Jar Exporter основан на другой кодовой базе.

(на основе Андриана):

<jar id = "files" jarfile = "all.jar">
  <zipgroupfileset dir = "${library.dir}" includes = "*.jar" excludes = "test-helper.jar"/>
  <zipfileset src = "first.jar" includes = "**/*.java **/*.class"/>
  <zipfileset src = "second.jar" includes = "**/*.java **/*.class"/>
  <fileset dir = ".">
    <include name = "LICENSE"/>
    <include name = "NOTICE"/>
  </fileset>
</jar>

Для этого вам следует использовать плагин maven shading. Я часто использую maven для создания автономного файла jar, и он настолько мощный

Узнать больше:

http://maven.apache.org/plugins/maven-shade-plugin/examples/includes-excludes.html

Я думаю, что вам нужен инструмент JarSplice: http://ninjacave.com/jarsplice

нет требует Ant или Maven, имеет собственный графический интерфейс, прост в использовании и выполняет именно то, что вы просили -> Он объединяет содержимое нескольких файлов jar в один (обратите внимание, что он все еще должен добавить свой собственный загрузчик классов).

Другие вопросы по теме