Есть ли способ заставить maven (2.0.9) включить все зависимости в один файл jar?
У меня есть проект сборки в один файл JAR. Я хочу, чтобы классы из зависимостей также копировались в банку.
Обновление: я знаю, что я не могу просто включить файл JAR в файл JAR. Я ищу способ распаковать файлы jar, указанные как зависимости, и упаковать файлы классов в мой файл jar.
Ответы:
Вы можете сделать это с помощью плагина maven-assembly с дескриптором jar-with-dependencies. Вот соответствующий фрагмент из одного из наших pom.xml, который делает это:
источник
attached
Целью является устаревшим. Цельsingle
илиdirectory-single
должна быть предпочтительнее.directory-single
теперь также устарела.В Maven 2 правильный способ сделать это - использовать плагин сборки Maven2, у которого есть предопределенный файл дескриптора для этой цели, который вы можете просто использовать в командной строке:
Если вы хотите сделать этот jar исполняемым, просто добавьте основной класс для запуска в конфигурацию плагина:
Если вы хотите создать эту сборку как часть обычного процесса сборки, вам следует привязать единственную или единственную цель каталога (
assembly
цель должна выполняться ТОЛЬКО из командной строки) к фазе жизненного цикла (package
имеет смысл), что-то вроде этого:Адаптируйте
configuration
элемент в соответствии со своими потребностями (например, с помощью материала манифеста, как говорится).источник
Если вы хотите создать исполняемый файл JAR, им также нужно установить основной класс. Так что полная конфигурация должна быть.
источник
<appendAssemblyId>false</appendAssemblyId>
внутрь<configuration>
тега, чтобы исключить суффикс "-jar-with-dependencies" в окончательном имени.Есть плагин Shade Maven . Он может использоваться для упаковки и переименования зависимостей (чтобы исключить проблемы с зависимостями в пути к классам).
источник
Вы можете использовать только что созданную банку, используя
<classifier>
тег.источник
Если вам (как и мне) особенно не нравится описанный выше подход jar-with-dependencies , я предпочитаю maven-решение - просто создать WAR-проект, даже если вы создаете только отдельное java-приложение:
Сделайте обычный maven jar-проект, который соберет ваш jar-файл (без зависимостей).
Кроме того, настройте военный проект maven (только с пустым файлом src / main / webapp / WEB-INF / web.xml , который позволит избежать предупреждения / ошибки в сборке maven), в котором ваш jar-проект имеет только зависимость, и сделайте свой jar-проект
<module>
под свой war-проект. (Этот war-проект - всего лишь простая уловка, чтобы обернуть все ваши зависимости jar-файла в zip-файл.)Создайте военный проект для создания военного файла.
На этапе развертывания просто переименуйте ваш .war-файл в * .zip и разархивируйте его.
Теперь у вас должен быть каталог lib (который вы можете переместить куда хотите) с вашим jar-файлом и всеми зависимостями, необходимыми для запуска вашего приложения:
(Подстановочный знак в classpath работает в Java-6 или выше)
Я думаю, что это проще в установке в maven (не нужно возиться с плагином сборки), а также дает более четкое представление о структуре приложения (вы увидите номера версий всех зависимых jar-файлов в простом виде, и избегать засорения всего в один jar-файл).
источник
http://fiji.sc/Uber-JAR дает отличное объяснение альтернатив:
источник
META-INF/services
каталоге. Более подробная информация здесь: maven.apache.org/plugins/maven-shade-plugin/examples/…источник
Мое окончательное решение для Eclipse Luna и m2eclipse: Custom Classloader (скачать и добавить в свой проект, только 5 классов): http://git.eclipse.org/c/jdt/eclipse.jdt.ui.git/plain/org. eclipse.jdt.ui / jar% 20in% 20jar% 20loader / org / eclipse / jdt / internal / jarinjarloader / ; этот загрузчик классов является самым лучшим из загрузчиков классов с одной флягой и очень быстрым;
<project.mainClass>org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader</project.mainClass> <project.realMainClass>my.Class</project.realMainClass>
Отредактируйте в JIJConstants "Rsrc-Class-Path" в "Class-Path"
mvn чистой зависимости: пакет copy-dependencies
создает jar с зависимостями в папке lib с тонким загрузчиком классов
источник
Отложив Maven в сторону, вы можете поместить JAR-библиотеки в Main Jar, но вам нужно будет использовать свой собственный загрузчик классов.
Проверить этот проект: текст ссылки на один JAR
источник
Этот пост может быть немного старым, но у меня тоже недавно была такая же проблема. Первое решение, предложенное Джоном Штауффером, является хорошим, но у меня были некоторые проблемы, так как я работаю этой весной. Я использую пружинные зависимости-файлы, которые я использую, имеет несколько файлов свойств и объявление xml-схем, которые имеют одинаковые пути и имена. Несмотря на то, что эти jar- файлы получены из одних и тех же версий, maven-goal jar-with-dependencies перезаписывал файл тезисов последним найденным файлом.
В конце концов, приложение не удалось запустить, так как пружинные банки не смогли найти правильные файлы свойств. В этом случае решение, предложенное Rop, решило мою проблему.
Также с тех пор проект весенней загрузки теперь существует. У него есть очень крутой способ справиться с этой проблемой, предоставив maven цель, которая перегружает цель пакета и предоставляет собственный загрузчик классов. См. Spring-boots Справочное руководство
источник
Посмотрите на этот ответ:
Я создаю установщик, который работает как файл JAR Java, и ему нужно распаковать файлы WAR и JAR в соответствующие места в каталоге установки. Плагин зависимости можно использовать на этапе пакета с целью копирования, и он загрузит любой файл в хранилище Maven (включая файлы WAR) и запишет их там, где они вам нужны. Я изменил выходной каталог на $ {project.build.directory} / classes, и в результате я получил обычную задачу JAR, в которую включены мои файлы. Затем я могу извлечь их и записать в каталог установки.
источник
Спасибо. Я добавил ниже фрагмент кода в файле POM.xml, и проблема с Mp решена, и создаю файл с полным jar-файлом, который включает все зависимые jar-файлы.
источник