Самый простой способ объединить релиз в один JAR-файл
-
09-06-2019 - |
Вопрос
Есть ли инструмент или скрипт, который легко объединяет кучу БАНКА файлы в один 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 немного сломан, так что я постараюсь его починить.Тот Самый Мавен pom.xml
файл, по-видимому, тоже был поврежден, так что мне придется исправить это, прежде чем исправлять jrst ...Я чувствую себя магнитом для насекомых :-)
Обновить:У меня так и не нашлось времени починить это приложение, но я проверил Затмение"Запускаемый мастер экспорта JAR", основанный на fat JAR.Я нашел это очень простым в использовании для развертывания моего собственного кода.
Некоторые из других отличных предложений могут быть лучше для сборок в среде, отличной от Eclipse, oss, вероятно, следует создать хорошую сборку, используя Муравей.(Maven до сих пор только причинял мне боль, но другим это нравится.)
Решение
Запускаемый мастер экспорта JAR-файлов Eclipse 3.4 от JDT.
В Eclipse 3.5 это было расширено.Теперь вы можете выбрать, как вы хотите обрабатывать JAR-файлы, на которые ссылаются ваши ссылки.
Другие советы
Муравьиный 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", которая работает следующим образом (при условии, что ваш манифест называется "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>
Если вы являетесь Мавен пользователь, как правило, с помощью плагина assembly делает то, что вы хотите, или, возможно, с помощью плагина shade, а в некоторых случаях и с их комбинацией.
С помощью плагина assembly вы помещаете файл манифеста в свой проект со всеми необходимыми настройками, хотя значения по умолчанию обычно довольно хороши.Затем строительство завершается с помощью
mvn assembly:assembly
Или, если вам нужно решить более важные задачи, одну из других целей.Все файлы JAR, которые нужно включить, распознаются преобразователем зависимостей Maven.Если вы используете плагин shade, это обычно является частью цели установки, и в одном конкретном проекте, которым я сейчас занимаюсь, я делаю
mvn install
mvn assembly:single
Тот Самый assembly:single
цель состоит в том, чтобы обойти пожизненные проблемы, в данном случае в Весна применение.
Вы можете использовать Джарджар который будет использовать затенение пакета, чтобы убедиться, что ваш JAR-файл не конфликтует с другими.
Есть Предусмотрительный который не только объединяет ваши файлы JAR в один, но и может оптимизировать, очистить или запутать файлы ваших классов, делая результирующий файл JAR намного меньше суммы всех предыдущих файлов JAR.
Я действительно попробовал ProGuard с помощью инструмента JRST, и все так, как вы сообщили.Я попытался отследить проблему и обнаружил, что она связана с ошибка в библиотеке ICU4J, на которую ссылается jrst.Проблема в том, что используемая версия отделения интенсивной терапии на данный момент сильно устарела.Поэтому я заменил icu.jar
файл с ICU4J версии 3.2.Теперь ProGuard находит кучу других ошибок / предупреждений о несоответствиях с библиотеками JRST.
Я предполагаю, что ProGuard работает так, как ожидалось, но библиотеки jrst просто не согласованы.Я не знаю, можете ли вы сделать гораздо больше, чем просто поговорить с его разработчиками, поскольку они должны проверять и обновлять зависимости проекта.
(по материалам Андриана):
<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, и он был расширен с поддержкой таких фреймворков , как Весна и Угадай, что может создать проблемы для других подходов.Он также обрабатывает classloader-инверсию - где некоторые файлы JAR являются внешними по отношению к One-JAR (например, JDBC драйверы, которые могут поставляться не в комплекте).
One-JAR - это командная строка, с Муравей и Мавен 2 плагина.Его также просто создать, просто используя инструмент "jar".
Я также могу порекомендовать Eclipse Jar Exporter (доступный для запуска), о котором Ференс Хехлер написал:он проделал огромную работу, предложив простой подход к упаковке набора файлов JAR.Мы с ним работали над One-JAR, но Jar Exporter основан на другой кодовой базе.
Существует инструмент под названием автожар который просканирует ваш байт-код и скомпилирует файл .jar с найденными классами, включая ссылочные (импортированные) классы.
Однако это не всегда работает с чем-то вроде Spring, где вы указываете имена классов в конфигурации, и они загружаются фреймворком.
Или с помощью плагина Maven assembly (mvn assembly: сборка)
Я думаю, что инструмент, который вам здесь нужен, это Кусочек баночки: http://ninjacave.com/jarsplice
Это так и есть нет требуется Ant или Maven, имеет свой собственный графический интерфейс, он прост в использовании и делает именно то, что вы просили --> Он объединяет содержимое нескольких jar-файлов в один (пожалуйста, обратите внимание, что ему все равно нужно добавить свой собственный загрузчик классов).
Для этого вам следует использовать плагин maven shading plugin.Я часто использую maven для создания автономного jar-файла, и он такой мощный
Показать еще:
http://maven.apache.org/plugins/maven-shade-plugin/examples/includes-excludes.html
Звучит как Муравей - Апач это то, что вы ищете.