Ответ 1
Eclipse 3.4 JDT Runnable JAR export wizard.
В Eclipse 3.5 это было расширено. Теперь вы можете выбрать, как вы хотите обрабатывать ваши 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, до сих пор только что дал мне боль, но другим это нравится.)
Eclipse 3.4 JDT Runnable JAR export wizard.
В Eclipse 3.5 это было расширено. Теперь вы можете выбрать, как вы хотите обрабатывать ваши JAR файлы, на которые ссылаются.
Ant zipfileset
выполняет ли задание
<jar id="files" jarfile="all.jar">
<zipfileset src="first.jar" includes="**/*.java **/*.class"/>
<zipfileset src="second.jar" includes="**/*.java **/*.class"/>
</jar>
Попробовав несколько разных решений, я нашел 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>
Если вы Maven, как правило, плагин сборки делает то, что вы хотите, или, возможно, теневой плагин, а в некоторых случаев комбинация.
С плагином сборки вы помещаете файл манифеста в свой проект с любыми необходимыми настройками, хотя значения по умолчанию обычно неплохие. Затем здание выполняется с помощью
mvn assembly:assembly
Или, если у вас есть особые вещи для решения одной из других целей. Все JAR файлы, которые нужно включить, подбираются с помощью искателя зависимостей Maven. Если вы используете плагин с оттенками, он обычно является частью цели установки, и в одном конкретном проекте, который я делаю сейчас, я делаю
mvn install
mvn assembly:single
Цель assembly:single
состоит в том, чтобы обойти жизненные проблемы, в данном случае в приложении Spring.
Существует ProGuard, который не только упаковывает ваши файлы JAR в один, но также может оптимизировать, очистить или обфускать ваш класс файлов, что делает полученный JAR файл намного меньше, чем сумма всех файлов JAR раньше.
Я действительно пробовал ProGuard с помощью инструмента JRST, и это, как вы сообщили. Я попытался отследить проблему и нашел, что она связана с ошибка в библиотеке ICU4J, на которую ссылается jrst. Проблема в том, что используемая версия ICU далеко устарела прямо сейчас. Поэтому я заменил файл icu.jar
на ICU4J версии 3.2. Теперь ProGuard обнаруживает множество других ошибок/предупреждений о несоответствиях с библиотеками JRST.
Я предполагаю, что ProGuard работает так, как ожидалось, но библиотеки jrst просто несовместимы. Я не знаю, можете ли вы сделать гораздо больше, чем поговорить со своими разработчиками, так как они должны проверять и обновлять зависимости проекта.
Вы можете использовать JarJar, который будет использовать затенение пакетов, чтобы убедиться, что ваш JAR файл не конфликтует с другими.
(на основе 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>
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 основывался на другой кодовой базе.
Существует инструмент под названием autojar, который сканирует ваш байт-код и компилирует файл .jar с его классами, включая ссылки (импортированных) классов.
Не всегда работает с чем-то вроде Spring, хотя вы указываете имена классов в конфигурации и загружаетесь в фреймворк.
Или используя плагин сборки Maven (сборка mvn: сборка)
Я думаю, что инструмент, который вам нужен, это JarSplice: http://ninjacave.com/jarsplice
Он не требует Ant или Maven, имеет свой собственный графический интерфейс, просто использовать и делать именно то, что вы просили → Он объединяет содержимое нескольких файлов jar в один (обратите внимание, что ему еще нужно добавить свой собственный загрузчик классов).
Для этого вы должны использовать плагин maven shading. Я часто использую maven для создания автономного файла jar, и он настолько мощный
Подробнее:
http://maven.apache.org/plugins/maven-shade-plugin/examples/includes-excludes.html
Звучит как Apache Ant - это то, что вы ищете.