Самый простой способ объединить релиз в один файл JAR - PullRequest
70 голосов
/ 17 сентября 2008

Существует ли инструмент или скрипт, который легко объединяет кучу файлов 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, видимо, тоже был поврежден, поэтому мне придется это исправить, прежде чем исправлять ... Я чувствую себя как магнит: -)


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

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

Ответы [ 13 ]

62 голосов
/ 09 октября 2008

Муравьи zipfileset делает работу

<jar id="files" jarfile="all.jar">
    <zipfileset src="first.jar" includes="**/*.java **/*.class"/>
    <zipfileset src="second.jar" includes="**/*.java **/*.class"/>
</jar>
33 голосов
/ 17 сентября 2008

Eclipse 3.4 Мастер экспорта JNT Runnable JAR.

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

27 голосов
/ 17 сентября 2008

Перепробовав несколько разных решений, я нашел 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>
14 голосов
/ 17 сентября 2008

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

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

mvn assembly:assembly

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

mvn install
mvn assembly:single

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

8 голосов
/ 22 сентября 2008

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

8 голосов
/ 17 сентября 2008

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

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

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

7 голосов
/ 13 апреля 2011

(по Андриану):

<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>
5 голосов
/ 17 июля 2010

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

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

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

3 голосов
/ 17 сентября 2008

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

3 голосов
/ 17 сентября 2008

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

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

...