Самый простой способ объединить релиз в один JAR-файл

StackOverflow https://stackoverflow.com/questions/81260

Вопрос

Есть ли инструмент или скрипт, который легко объединяет кучу БАНКА файлы в один 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

Звучит как Муравей - Апач это то, что вы ищете.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top