Я хочу упаковать свой проект в один исполняемый файл JAR для распространения.
Как сделать пакет проекта Maven всеми JAR-файлами зависимостей в свой выходной JAR-файл?
Я хочу упаковать свой проект в один исполняемый файл JAR для распространения.
Как сделать пакет проекта Maven всеми JAR-файлами зависимостей в свой выходной JAR-файл?
Ответы:
и вы запускаете его с
Цель компиляции должна быть добавлена перед сборкой: отдельный код или код вашего собственного проекта не включены.
Подробности смотрите в комментариях.
Обычно эта цель связана с этапом сборки для автоматического выполнения. Это гарантирует, что JAR
mvn install
создается при выполнении или выполнении развертывания / выпуска.источник
mvn clean compile assembly:single
.<appendAssemblyId>false</appendAssemblyId>
в,configuration
чтобы избежать раздражающего суффикса "-jar-with-dependencies" в имениcompile
и ты облажался.Вы можете использовать плагин зависимостей для генерации всех зависимостей в отдельном каталоге до фазы пакета, а затем включить его в путь к классу манифеста:
В качестве альтернативы используйте
${project.build.directory}/classes/lib
как OutputDirectory для интеграции всех jar-файлов в основной jar, но тогда вам нужно будет добавить собственный код загрузки классов для загрузки jar.источник
${project.build.directory}/classes/lib
как,outputDirectory
чтобы иметь один основной .jar со всеми зависимостями внутри, но - Как добавить пользовательский код загрузки классов для загрузки этих jar? Мне нужно , чтобы сделать выполнение работ , как:java -jar main-jar-with-deps.jar
. Это возможно ?Я написал в блоге о некоторых разных способах сделать это.
Смотрите исполняемый файл Jar с Apache Maven (WordPress)
или исполняемый пример jar-with-maven (GitHub)
Ноты
Эти плюсы и минусы предоставлены Стефаном .
Для ручного развертывания
Копировать зависимости в конкретный каталог
Сделать Jar исполняемым и Classpath Aware
На данный момент
jar
фактически выполняется с внешними элементами classpath.Сделать Развертываемые Архивы
jar
Файл является исполняемым только с родственным...lib/
каталогом. Нам нужно сделать архивы для развертывания с каталогом и его содержимым.Теперь у вас есть,
target/${project.build.finalName}.(zip|tar|tar.bz2|tar.gz)
каждый из которых содержитjar
иlib/*
.Сборочный плагин Apache Maven
У вас есть
target/${project.bulid.finalName}-jar-with-dependencies.jar
.Плагин Apache Maven Shade
У вас есть
target/${project.build.finalName}-shaded.jar
.onejar-Maven-плагин
Плагин Spring Boot Maven
У вас есть
target/${project.bulid.finalName}-spring-boot.jar
.источник
Принимая ответ без ответа и переформатируя его, мы имеем:
Далее, я бы порекомендовал сделать это естественной частью вашей сборки, а не чем-то, чтобы вызывать явно. Чтобы сделать это неотъемлемой частью вашей сборки, добавьте этот плагин к себе
pom.xml
и привяжите его кpackage
событию жизненного цикла. Однако есть одна проблема: вам нужно вызыватьassembly:single
цель, если вы помещаете это в ваш файл pom.xml, тогда как вы вызываете «сборка: сборка», если выполняете ее вручную из командной строки.источник
Используйте maven-shade-plugin, чтобы упаковать все зависимости в один uber-jar. Его также можно использовать для создания исполняемого файла jar, указав основной класс. Попытавшись использовать maven-assembly и maven-jar, я обнаружил, что этот плагин лучше всего соответствует моим потребностям.
Я нашел этот плагин особенно полезным, так как он объединяет содержимое определенных файлов, а не перезаписывает их. Это необходимо, когда есть файлы ресурсов с одинаковыми именами в банках и плагин пытается упаковать все файлы ресурсов
См пример ниже
источник
Долго пользовался плагином сборки maven , но не смог найти решение проблемы с
"already added, skipping"
. Теперь я использую другой плагин - onejar-maven-plugin . Пример ниже (mvn package
сборка jar):Вам нужно добавить репозиторий для этого плагина:
источник
Вы можете использовать maven-dependency-plugin, но вопрос был в том, как создать исполняемый JAR. Для этого требуется следующее изменение ответа Мэтью Френглена (кстати, использование плагина зависимости занимает больше времени при запуске с чистой цели):
источник
Вы можете использовать плагин Maven-Shade для создания Uber Jar, как показано ниже
источник
Другой вариант, если вы действительно хотите упаковать другое содержимое JAR-файла в ваш единственный результирующий JAR-файл, - это плагин Maven Assembly . Распаковывает, а затем перепаковывает все в каталог через
<unpack>true</unpack>
. Тогда у вас будет второй проход, который встроит его в один массивный JAR.Другой вариант - плагин OneJar . Это выполняет вышеуказанные действия по переупаковке всего за один шаг.
источник
Вы можете добавить следующее в ваш pom.xml :
После этого вам нужно переключиться через консоль в каталог, где находится файл pom.xml. Затем вы должны выполнить сборку mvn: single, и тогда ваш исполняемый JAR-файл с зависимостями будет скомпилирован. Вы можете проверить это, переключившись в выходной (целевой) каталог с помощью cd ./target и запустив свой jar с помощью команды, подобной java -jar mavenproject1-1.0-SNAPSHOT-jar-with-dependencies.jar .
Я проверял это с Apache Maven 3.0.3 .
источник
Я просмотрел все эти ответы, пытаясь создать полный исполняемый файл jar, содержащий все зависимости, и ни один из них не работал правильно. Ответ - плагин Shade, он очень прост и понятен.
Имейте в виду, что ваши зависимости должны иметь область компиляции или времени выполнения для правильной работы.
Этот пример пришел с mkyong.com
источник
plugin
Элемент попадает вpom.xml
Underbuild/plugins
.Вы могли бы объединить
maven-shade-plugin
иmaven-jar-plugin
.maven-shade-plugin
Пакеты классов и всю зависимость в одном файле фляга.maven-jar-plugin
чтобы указать главный класс исполняемой баночки (см Set Up The Classpath , глава "Make The Jar Исполняемого").Пример конфигурации POM для
maven-jar-plugin
:Наконец, создайте исполняемый файл jar, вызвав:
источник
Кен Лю имеет это право по моему мнению. Плагин зависимостей maven позволяет расширять все зависимости, которые затем можно рассматривать как ресурсы. Это позволяет включить их в основной артефакт. Использование плагина сборки создает вторичный артефакт, который может быть трудно изменить - в моем случае я хотел добавить пользовательские записи манифеста. Мой пом закончился как:
источник
Должно быть так:
Распаковка должна быть в фазе создания ресурсов, потому что, если она находится в фазе упаковки, она не будет включена в качестве ресурсов. Попробуйте чистую упаковку, и вы увидите.
источник
Проблема с поиском общего файла сборки с помощью maven-assembly-plugin-2.2.1?
Попробуйте использовать параметр конфигурации descriptorId вместо параметров descriptors / descriptor или descriptorRefs / descriptorRef.
Ни один из них не делает то, что вам нужно: ищите файл в classpath. Конечно, вам нужно добавить пакет, где общая сборка находится в пути к классу maven-assembly-plugin (см. Ниже). Если вы используете Maven 2.x (не Maven 3.x), вам может потребоваться добавить эту зависимость в самый верхний родительский pom.xml в разделе pluginManagement.
Смотрите это для более подробной информации.
Класс: org.apache.maven.plugin.assembly.io.DefaultAssemblyReader
Пример:
источник
Чтобы решить эту проблему, мы будем использовать Maven Assembly Plugin, который создаст JAR вместе с зависимыми JAR-файлами в один исполняемый JAR-файл. Просто добавьте ниже конфигурацию плагина в ваш файл pom.xml.
После этого не забудьте запустить инструмент MAVEN с этой командой mvn clean compile Assembly: single
http://jkoder.com/maven-creating-a-jar-together-with-its-dependency-jars-into-a-single-executable-jar-file/
источник
Я не буду отвечать на этот вопрос напрямую, так как другие уже делали это раньше, но мне действительно интересно, стоит ли встраивать все зависимости в сам файл проекта.
Я вижу смысл (простота развертывания / использования), но это зависит от варианта использования вашего проекта (и могут быть альтернативы (см. Ниже)).
Если вы используете его полностью автономно, почему бы и нет.
Но если вы используете свой проект в других контекстах (например, в веб-приложении или помещены в папку, где находятся другие jar-файлы), у вас могут быть дубликаты jar в вашем classpath (те, что в папке, те, что в банках). Возможно не сделка предложения, но я обычно избегаю этого.
Хорошая альтернатива:
Таким образом, имея в конце всего лишь манифест и «специальный динамический основной загрузчик классов», вы можете начать свой проект с:
источник
Чтобы создать исполняемый JAR из самой командной строки, просто запустите приведенную ниже команду из пути проекта:
источник
pom.xml
иначе вы получитеError reading assemblies: No assembly descriptors found.
. Это то, что происходит со мной в любом случае.Это лучший способ, который я нашел:
При такой конфигурации все зависимости будут расположены в
/dependency-jars
. У моего приложения нетMain
класса, только контекстные, но у одной из моих зависимостей естьMain
класс (com.myDomain.etc.MainClassName
), который запускает сервер JMX и получает параметрstart
илиstop
. Таким образом, я смог запустить свое приложение так:Я жду, что это будет полезно для всех вас.
источник
Я сравнил дерево плагинов, упомянутых в этом посте. Я сгенерировал 2 банки и каталог со всеми банками. Я сравнил результаты и определенно лучше всего подходит maven-shade-plugin. Моя проблема заключалась в том, что у меня есть несколько ресурсов Spring, которые необходимо объединить, а также Jax-rs и JDBC-сервисы. Все они были правильно объединены плагином Shade по сравнению с плагином maven-assembly-plugin. В этом случае пружина потерпит неудачу, если вы не скопируете их в свою папку ресурсов и не объедините их вручную один раз. Оба плагина выводят правильное дерево зависимостей. У меня было несколько областей, таких как test, предоставить, скомпилировать и т.д. Они оба создали один и тот же манифест, но я смог объединить лицензии с плагином Shade, используя их преобразователь. С плагином Maven-зависимостей, конечно, вы не У меня нет таких проблем, потому что банки не извлечены. Но, как некоторые другие указали, вам нужно иметь один дополнительный файл (ы) для правильной работы. Вот фрагмент pom.xml
источник
Что-то, что сработало для меня, было:
У меня был необычный случай, потому что моя зависимость была системной:
Я изменил код, предоставленный @ user189057, с изменениями: 1) maven-dependency-plugin выполняется в фазе "prepare-package" 2) Я извлекаю распакованный класс прямо в "target / classes"
источник
Я попытался получить самый голосующий ответ здесь, и я смог сделать флягу пригодной для использования. Но программа не работает правильно. Я не знаю, в чем причина. Когда я пытаюсь запустить из
Eclipse
, я получаю другой результат, но когда я запускаю jar из командной строки, я получаю другой результат (он вылетает из-за ошибки времени выполнения программы).У меня было такое же требование, как и у OP, только то, что у меня было слишком много зависимостей (Maven) для моего проекта. К счастью, единственное решение, которое сработало для меня, это использование
Eclipse
. Очень просто и очень просто. Это не решение для OP, но решение для кого-то, у кого есть подобное требование, но со многими зависимостями Maven,1) Просто щелкните правой кнопкой мыши папку вашего проекта (в Eclipse) и выберите
Export
2) Затем выберите
Java
->Runnable Jar
3) Вам будет предложено выбрать местоположение файла JAR
4) Наконец, выберите класс, который имеет метод Main, который вы хотите запустить, выберите
Package dependencies with the Jar file
и нажмитеFinish
источник
Это также может быть вариантом, вы сможете собрать свой файл JAR
источник
Для тех, кто ищет варианты для исключения определенных зависимостей из uber-jar, это решение, которое сработало для меня:
Так что это не конфигурация mvn-assembly-plugin, а свойство зависимости.
источник
Уже есть миллионы ответов, я хотел бы добавить, что вам не нужно,
<mainClass>
если вам не нужно добавлять entryPoint в ваше приложение. Например, API могут не обязательно иметьmain
метод.Конфигурация плагина maven
строить
проверить
источник
Добавить в pom.xml:
а также
Это оно. Следующий пакет mvn также создаст еще один толстый jar-файл, включая все jar-файлы зависимостей.
источник
Плагин Maven-Assembly-отлично работал для меня. Я провел часы с плагином maven-dependency-и не мог заставить его работать. Основная причина заключалась в том, что мне пришлось четко определить в разделе конфигурации элементы артефакта, которые должны быть включены, как описано в документации . Там есть пример для случаев, когда вы хотите использовать его как:,
mvn dependency:copy
где нет включенных artifactItems, но он не работает.источник
Этот пост в блоге демонстрирует другой подход к объединению плагинов maven-jar и maven-assembly. С помощью xml конфигурации сборки из поста в блоге также можно контролировать, будут ли расширяться зависимости или они будут просто собраны в папке и на которые будет ссылаться запись classpath в манифесте:
И именно это описано здесь: https://caffebig.wordpress.com/2013/04/05/executable-jar-file-with-dependent-jars-using-maven/
источник
источник
Итак, это мое решение. Я знаю, что он не использует файл pom.xml. Но у меня была проблема, моя программа компилировалась и работала на NetBeans, но она не работала, когда я пробовал Java -jar MyJarFile.jar. Теперь я не до конца понимаю Maven, и думаю, поэтому у меня возникли проблемы с тем, чтобы Netbeans 8.0.2 включил мой jar-файл в библиотеку, чтобы поместить их в jar-файл. Я думал о том, как я использовал файлы JAR без Maven в Eclipse.
Это Maven, который может скомпилировать все зависимости и плагины. Не Netbeans. (Если вы можете получить NetBeans и использовать java .jar, пожалуйста, скажите мне, как (^. ^) V)
[Решено - для Linux], открыв терминал.
затем
следующий
следующий
Это создаст файл JAR в целевой директории.
Сейчас же
(Вы , возможно , потребуется выполнить:
chmod +x MyJarFile-1.0-jar-with-dependencies.jar
)И наконец
Посмотри пожалуйста
https://cwiki.apache.org/confluence/display/MAVEN/LifecyclePhaseNotFoundException
Я опубликую это решение на нескольких других страницах с похожей проблемой. Надеюсь, я смогу спасти кого-то от недели разочарования.
источник