Найпростіший спосіб об’єднати випуск в один файл JAR


74

Чи є інструмент або сценарій, який легко поєднує купу 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 "Runnable JAR майстра експорту" «s , який заснований на жирну JAR. Я знайшов це дуже простим у використанні для розгортання власного коду.

Деякі інші чудові пропозиції можуть бути кращими для збірок в середовищі, що не затьмарюється, Oss, мабуть, повинен зробити гарну збірку за допомогою Ant . (Мейвен, поки що щойно дав мені біль, але інші це люблять.)




Відповіді:


34

Майстер експорту JAR в Eclipse 3.4 JDT.

В Eclipse 3.5 це було продовжено. Тепер ви можете вибрати, як ви хочете обробляти файли JAR, на які посилаються.


Чи можете ви перевірити, чи можна використовувати створені сценарії мурашок? Раніше виникла проблема з абсолютними шляхами файлів замість відносними.
Торбьорн Равн Андерсен

62

Мураха zipfilesetробить роботу

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

1
+1, оскільки це також дозволяє додавати теги <manifest /> і встановлювати основний клас.
Ширкрін

Чи можна було б якось зробити це для всіх файлів jar в каталозі. Було б дуже акуратно. Уникайте необхідності оновлювати build.xml при зміні бібліотек.
Франс Лундберг

3
Спробуйте такий підхід, і вам не доведеться турбуватися про додавання нових банок: github.com/anupamsaini/Trie/blob/master/src/build.xml#L42
Анупам

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 - це мураха; є власне мурашине завдання "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
Можливість написання однієї банки з мурашкою робить її придатною для використання в системах безперервного нарощування.
Thorbjørn Ravn Andersen

1. Чи здатний One-JAR, якщо всередині моєї банки є кілька програм (кілька класів точок входу)? 2. Що робити, якщо цей jar використовується іншим додатком, чи може він також використовувати класи у вкладених банках всередині "One-JAR"?
MRalwasser,

14

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

За допомогою плагіна збірки ви додаєте файл маніфесту до свого проекту з будь-якими необхідними налаштуваннями, хоча за замовчуванням зазвичай цілком непогані. Потім будівництво виконується за допомогою

mvn assembly:assembly

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

mvn install
mvn assembly:single

assembly:singleМета полягає в тому, щоб обійти проблеми , прижиттєві, в цьому випадку в Спрінг додатку.


8

Ви можете використовувати JarJar, який використовуватиме тіньовий пакет, щоб переконатися, що ваш файл JAR не конфліктує з іншими.


8

Існує ProGuard, який не тільки упаковує ваші файли JAR в один, але він також може оптимізувати, очистити або затуманити ваші файли класів, роблячи отриманий файл JAR набагато меншим, ніж сума всіх файлів JAR раніше.

Я насправді спробував ProGuard за допомогою інструменту JRST, і це так, як ви повідомляли. Я спробував виявити проблему і виявив, що вона пов'язана з помилкою в бібліотеці ICU4J, на яку посилається jrst. Проблема в тому, що використовувана версія реанімаційного відділення на сьогоднішній день застаріла. Тому я замінив icu.jarфайл на ICU4J версії 3.2. Тепер ProGuard знаходить купу інших помилок / попереджень про нестабільність у бібліотеках JRST.

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


Дякую! я завантажив його і спробував, але в цьому частковому полі він бомбардував невідомим постійним полем на icu4j-2.6.1.jar,
tovare

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>

5

One-JAR 0.97 щойно вийшов на сайті http://one-jar.sourceforge.net , і він був розширений завдяки підтримці таких фреймворків, як Spring та Guice , що може спричинити проблеми для інших підходів. Він також обробляє інверсію навантажувача класів - де деякі файли JAR є зовнішніми для One-JAR (наприклад, драйвери JDBC, які не можуть бути в комплекті).

One-JAR - це командний рядок, з плагінами Ant і Maven 2. Також просто побудувати за допомогою інструменту "jar".

Я також можу порекомендувати Eclipse Jar Exporter (Runnable), про який писав Ференс Хечлер: він провів чудову роботу, запропонувавши простий підхід до обгортання набору файлів JAR. Ми з ним працювали над One-JAR, але Jar Exporter базується на іншій кодовій базі.


3

Існує інструмент, який називається autojar який сканує ваш байт-код і компілює файл .jar із класами, які він знаходить, включаючи (імпортовані) класи.

Однак це не завжди працює з чимось на кшталт Spring, де ви вказуєте імена класів у конфігурації, і це завантажується фреймворком.


Дякую за вказівник, здається, що деякі .jars у цьому конкретному додатку викликає у мене головний біль, коли це робиться.
tovare


2

Я думаю, що тут вам потрібен інструмент JarSplice : http://ninjacave.com/jarsplice

Він не вимагає Ant або Maven, має власний графічний інтерфейс, його просто використовувати і робити саме те, що ви просили -> Він об’єднує вміст декількох jar-файлів в один (зверніть увагу, йому все одно потрібно додати власний завантажувач класів) ).



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.