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

Есть ли инструмент или script, который легко объединяет кучу файлов 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 немного сломан, поэтому я сделаю это исправление. Файл Maven pom.xml тоже был сломан, поэтому мне нужно будет исправить это до фиксации jrst... Я чувствую себя как ошибка-магнит: -)


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

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

Ответ 1

Eclipse 3.4 JDT Runnable JAR export wizard.

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

Ответ 2

Ant zipfileset выполняет ли задание

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

Ответ 3

Попробовав несколько разных решений, я нашел 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" ant, которая работает следующим образом (если ваш манифест называется "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>

Ответ 4

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

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

mvn assembly:assembly

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

mvn install
mvn assembly:single

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

(на основе Andrian's):

<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>

Ответ 8

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

One-JAR - это командная строка с Ant и Maven 2 плагина. Он также прост в построении, используя инструмент "jar".

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

Ответ 9

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

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

Ответ 10

Или используя плагин сборки Maven (сборка mvn: сборка)

Ответ 11

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

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

Ответ 13

Звучит как Apache Ant - это то, что вы ищете.