2008-09-17 17 views
70

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

Бетонный корпус - Java restructured text tool. Я хотел бы, чтобы запустить его с чем-то вроде:

Java -jar rst.jar

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


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

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

+0

http://www.jdotsoft.com/JarClassLoader.php – gorokhmn 2010-03-02 14:05:26

+0

[Fat Jar Eclipse Plugin] (http://fjep.sourceforge.net/) – 2008-09-17 09:07:13

+0

[One-Jar] (http: // one-jar. sourceforge.net/) – 2008-09-17 09:04:48

ответ

33

Eclipse 3.4 JDT запускаемый JAR-экспорт мастера.

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

+0

Не могли бы вы проверить, можно ли использовать скрипты муравьев? Раньше была проблема с абсолютными файловыми путями вместо относительной. – 2009-11-28 10:06:01

14

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

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

mvn assembly:assembly 

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

mvn install 
mvn assembly:single 

assembly:single цель состоит в том, чтобы работать вокруг пожизненных вопросов, в этом случае в Spring.

3

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

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

+0

Спасибо за указатель, кажется, что некоторые .jars в этом конкретном приложении дают мне некоторую головную боль, чтобы это сделать. – tovare 2008-09-17 13:31:04

27

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

Скриптивность однобарабанного муравья делает его пригодным для использования в системах непрерывной сборки. – 2009-11-28 10:07:00

+0

1. Способность One-JAR, если в моей банке есть несколько приложений (несколько классов точек входа)? 2. Что делать, если эта банка используется другим приложением, может ли она также использовать классы в вложенных банках внутри «One-JAR»? – MRalwasser 2012-05-02 10:09:47

8

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

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

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

+0

Спасибо! я загрузил его и попытался, но в этом поле боя он бомбил неизвестное постоянное поле на icu4j-2.6.1.jar, – tovare 2008-09-17 10:36:20

3

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

8

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

63

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

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

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

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

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

7

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

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

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

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