Есть ли инструмент или сценарий, который легко объединяет кучу файлов БАНКА в один файл 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, пока что мне только что причиняла боль, но другим это нравится.)
Если вы являетесь пользователем Maven, обычно плагин сборки делает то, что вы хотите, или, возможно, плагин тени, а в некоторых случаях их комбинация.
С помощью подключаемого модуля сборки вы помещаете в свой проект файл манифеста со всеми необходимыми настройками, хотя значения по умолчанию обычно довольно хороши. Затем сборка выполняется с помощью
mvn assembly:assembly
Или, если у вас есть более особые дела, одна из других целей. Все включаемые файлы JAR выбираются преобразователем зависимостей Maven. Если вы используете плагин тени, это обычно является частью цели установки, и в одном конкретном проекте, над которым я работаю сейчас, я использую
mvn install
mvn assembly:single
Цель assembly:single
- обойти проблемы времени жизни, в данном случае в приложении Spring.
Похоже, что Apache Ant - это то, что вы ищете.
Существует инструмент под названием автокожа, который сканирует ваш байт-код и компилирует файл .jar с найденными классами, включая ссылочные (импортированные) классы.
Однако не всегда работает с чем-то вроде Spring, где вы указываете имена классов в конфигурации, и они загружаются фреймворком.
Спасибо за указатель, похоже, что некоторые .jars в этом конкретном приложении вызывают у меня головную боль, когда это делается.
Eclipse 3.4 JDT's Runnable JAR-мастер экспорта.
В Eclipse 3.5 это было расширено. Теперь вы можете выбрать, как вы хотите обращаться с вашими ссылочными JAR-файлами.
Не могли бы вы проверить, можно ли использовать созданные ant-скрипты? Ранее возникла проблема с абсолютными путями к файлам вместо относительных.
Попробовав несколько различных решений, я обнаружил, что с 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 делает его пригодным для использования в системах непрерывной сборки.
1. Можно ли использовать One-JAR, если в моем jar-файле есть несколько приложений (несколько классов точек входа)? 2. Что, если этот jar-файл используется другим приложением, может ли оно также использовать классы во вложенных jar-файлах внутри «One-JAR»?
Существует ProGuard, который не только упаковывает ваши файлы JAR в один, но также может оптимизировать, очищать или скрывать ваши файлы классов, делая итоговый файл JAR намного меньше, чем сумма всех файлов JAR до этого.
Я действительно пробовал ProGuard с инструментом JRST, и все именно так, как вы сообщили. Я попытался отследить проблему и обнаружил, что она связана с Жук в библиотеке ICU4J, на которую ссылается jrst. Проблема в том, что используемая версия ICU сейчас сильно устарела. Поэтому я заменил файл icu.jar
на ICU4J версии 3.2. Теперь ProGuard находит кучу других ошибок / предупреждений о несоответствиях с библиотеками JRST.
Я предполагаю, что ProGuard работает так, как ожидалось, но библиотеки jrst просто несовместимы. Я не знаю, можете ли вы сделать намного больше, чем поговорить с его разработчиками, поскольку они должны проверять и обновлять зависимости проекта.
Спасибо! Я скачал его и попробовал, но в этом конкретном поле он бомбил неизвестным постоянным полем на icu4j-2.6.1.jar,
Или с помощью плагина сборки 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 /> и устанавливать основной класс.
Можно ли как-нибудь сделать это для всех файлов jar в каталоге. Было бы очень аккуратно. Избегайте необходимости обновлять build.xml при изменении библиотек.
Попробуйте этот подход, вам не придется беспокоиться о добавлении новых банок: github.com/anupamsaini/Trie/blob/master/src/build.xml#L42
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 в один (обратите внимание, что он все еще должен добавить свой собственный загрузчик классов).