Можно ли упаковать все зависимости jar в один большой jar?

Я знаю, что это не лучший метод, но могу ли я включить все зависимости в одну большую банку?

Ответы на вопрос(11)

legal или жеtechnical причины не

Legal: For example, we discovered that at the time we wanted to, we could not bundle the JavaMail jar files together into one big package with the rest of our app, but the license agreement said we had to keep them separate.

Technical: Another problem might be custom class loaders look for specific resources or classes inside of specific jar files. This often happens in the context of containers for application servers or ESBs.

Как: чтобы сделать это, просто распакуйте все в один каталог, а затем пересоберите jar оттуда. Возможно, вам придется настроить некоторые параметры в папке META-INF, чтобы удалить запросы на загрузку дополнительных jar-файлов и обработать случай, когда каждый jar-файл имеет класс по умолчанию для запуска. Есть некоторые сторонние утилиты, которые могут помочь, но если вы не знаете,what они делают, вы хотите быть осторожными.

 29 июн. 2009 г., 20:55
давайте предположим, что это законно, как вы это делаете?
Решение Вопроса

Один-Jar который делает то, что вы хотите, хотя я советую против этого. Спектакль обычно ужасный.

 30 июн. 2009 г., 00:16
Я давно им не пользовался, но напоминаю, что производительность загрузки классов была очень плохой из-за способа распаковки JAR-файлов. Но, как я уже сказал, это было давно.
 29 июн. 2009 г., 23:58
Пожалуйста, уточните ужасную производительность. Я использую это, и был бы признателен за обратную связь.

ет показаться ужасно неэффективным, но никто не жаловался мне на это с тех пор, как он был выпущен в 2004 году. Вероятным эффектом предварительной загрузки является общее ускорение загрузки классов для приложения, поскольку загрузчик классов не должен повторно сканировать путь к классам. для ресурсов и классов при запуске приложения: все имеет хеш-карту.

Довольно просто создать ленивый загрузчик, который будет загружать по требованию, но я из школы, которая говорит: «Построить, измерить, улучшить, если необходимо». и до сих пор не было необходимости улучшать его.

Я буду помнить об этом в будущих выпусках (или, если кто-то еще захочет заняться этим, это было бы также замечательно, поскольку без очень большого приложения, которое можно было бы измерить, трудно понять, являются ли изменения улучшением).

 13 дек. 2012 г., 15:07
Я упомяну это, поскольку он этого не сделал: @simontuffs является автором One-JAR.

You can use [uberjar]

You can use fatjar

 29 июн. 2009 г., 23:59
Фатжар использует одну банку, упомянутую в другом месте

что файлы .jar - это файлы .zip под обложками. Вы можете использовать ваши любимые почтовые инструменты, чтобы (пере) упаковать их. В этом случае вам придется иметь дело с файлом манифеста самостоятельно.

ProGuard сделаю это для вас, а также опционально запутывая и уменьшая JAR-файлы. Последняя функция особенно полезна для создания JAR-файлов окончательного развертывания.

Jar Jar Ссылки который сделает это для вас. Никогда не использовал это, но трудно забыть имя.

 29 июн. 2009 г., 21:00
минус один миллион за каламбур
 29 июн. 2009 г., 21:01
+1. Maven очень хорош тем, что заботится о таких вещах. Однако я рекомендую создавать пользовательские сборки, а не использовать jar-with-dependencies по умолчанию, так как вы можете получить намного лучшие результаты таким образом. Кроме того, стоит отметить, что последний плагин сборки несколько глючит & amp; добавьте несколько копий ваших зависимостей, поэтому, пока это не будет исправлено, я рекомендую использовать предыдущую версию.

zipgroupfileset с муравьемZip задача

<zip destfile="out.jar">
    <zipgroupfileset dir="lib" includes="*.jar"/>
</zip>

Это сгладит все включенные библиотеки jar & apos; содержание.

 04 дек. 2009 г., 04:06
Как мы должны обрабатывать несколько файлов Manifest в jar-файлах?
 07 янв. 2013 г., 16:41
Это требуетorg.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader работать. Включенные банки не будут доступны на classpath, если толькоorg.eclipse.jdt.internal.jarinjarloader пакет используется.

мыши свой проект, выберите «Извлечь» и перейдите к параметру «Runnable Jar». Выберите Далее. Выберите подходящие настройки и выключите и работайте. Также я напоминаю, что эта функциональность достигается с помощью тех же или похожих библиотек, которые использует FatJar (упомянутый выше).

 18 июл. 2010 г., 12:11
Это в основном эквивалентно ответу Владимира, потому что Eclipse создает задачу Ant zip для реализации этого.
 07 янв. 2013 г., 16:39
Eclipse используетorg.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader для достижения этой цели.

что называть выступление One-Jar ужасным и плохим несправедливо. Для приложений среднего размера можно ожидать, что запуск займет пару секунд дольше (хотя это не влияет на заставку JVM). Объем памяти, превышающий десятки мегабайт, незначителен для большинства сред, за исключением, возможно, встроенных систем. Кроме того, One-Jar способен автоматически извлекать некоторые файлы в файловую систему, что избавляет от необходимости разрабатывать установщик в моем случае.

Ниже приведена попытка количественно оценить влияние на производительность, представленное One-Jar для моего приложения. Это приложение с графическим интерфейсом на основе Swing, состоит из 352 классов, скрытых с помощью ProGuard 4.5b2. One-Jar 0.96 используется для объединения результирующих классов с библиотеками объемом 12 МБ (ODFDOM, Saxon HE, Xerces, Jaxen, VLDocking, Apache Commons и т. Д.). Я сравнил производительность запутанной банки с той же самой банкой, обработанной One-Jar.

From JVM start to the start of of main() method: 0.5s without One-Jar and 1.7s with One-Jar. From JVM start to the appearance of application window on the screen: 2.3s without One-Jar and 3.4s with One-Jar. So One-Jar adds 1.1s to startup time. One-Jar will not increase the delay between JVM start and splash image appearing on the screen (if implemented via jar manifest), so the startup time increase is not too annoying for interactive applications. We are talking about a class loader, so there should be no impact on code execution speed, unless you are extensively using dynamic class loading. Looking at JVM statistics (via jconsole) shows that One-Jar'red version takes more heap memory. For my application the overhead is in the order of tens of MBs. I saw figures like 16MB vs 40MB, 306MB vs 346MB, 131MB vs 138MB, depending on now much user data the application is handling and now long time ago garbage collector has been executed.

Приведенное выше время было получено с помощью отметки времени непосредственно перед запуском JVM из оболочки Linux, в начале метода main () и в обработчике события windowOpened () окна моего приложения. Измерения проводились на не очень быстром ноутбуке D820 с двухъядерным процессором 1 ГГц и 2 ГБ или ОЗУ под управлением Ubuntu 8.04.

Надеюсь, поможет.

Ваш ответ на вопрос