Как создать исполняемый JAR с Maven

Как создать исполняемый JAR с Maven

1. Вступление

В этой быстрой статье мы сосредоточимся наpackaging a Maven project into an executable Jar file.

Обычно при создании файлаjar мы хотим выполнить его легко, без использования IDE; с этой целью мы обсудим конфигурацию и плюсы / минусы использования каждого из этих подходов для создания исполняемого файла.

Дальнейшее чтение:

Учебник по Apache Maven

Краткое и практическое руководство по созданию и управлению проектами Java с использованием Apache Maven.

Read more

Где находится Maven Local Repository?

Краткое руководство, показывающее, где Maven хранит свои локальные репозитории и как это изменить.

Read more

Весна с Maven BOM

Узнайте, как использовать спецификацию, спецификацию в своем проекте Spring Maven.

Read more

2. конфигурация

Чтобы создать исполняемый файлjar, нам не нужны дополнительные зависимости. Нам просто нужно создать проект Maven Java и иметь хотя бы один класс с методомmain(…).

В нашем примере мы создали класс Java с именемExecutableMavenJar.

Нам также необходимо убедиться, что нашpom.xml содержит следующие элементы:

4.0.0
com.example
core-java
0.1.0-SNAPSHOT
jar

Наиболее важным аспектом здесь является тип - чтобы создать исполняемый файлjar, дважды проверьте, что конфигурация использует типjar.

Теперь мы можем начать использовать различные решения.

2.1. Ручная настройка

Начнем с ручного подхода - с помощьюmaven-dependency-plugin.

Сначала мы скопируем все необходимые зависимости в указанную нами папку:


    org.apache.maven.plugins
    maven-dependency-plugin
    
        
            copy-dependencies
            prepare-package
            
                copy-dependencies
            
            
                
                    ${project.build.directory}/libs
                
            
        
    

Следует обратить внимание на два важных аспекта. Сначала мы указываем цельcopy-dependencies, которая указывает Maven копировать эти зависимости в указанныйoutputDirectory.

В нашем случае мы создадим папку с именемlibs внутри каталога сборки проекта (обычно это папкаtarget).

На втором этапе мы собираемся создать исполняемый файл и путь к классуjar, со ссылкой на зависимости, скопированной на первом этапе:


    org.apache.maven.plugins
    maven-jar-plugin
    
        
            
                true
                libs/
                
                    org.example.executable.ExecutableMavenJar
                
            
        
    

Самая важная часть вышеупомянутого - это конфигурацияmanifest. Мы добавляем путь к классам со всеми зависимостями (папкаlibs/) и предоставляем информацию об основном классе.

Обратите внимание, что нам нужно предоставить полностью определенное имя класса, что означает, что он будет включать имя пакета.

Преимущества и недостатки этого подхода:

  • pros - прозрачный процесс, где мы можем указать каждый шаг

  • cons - вручную, зависимости выходят за пределы окончательногоjar, что означает, что ваш исполняемый файлjar будет запускаться только в том случае, если папкаlibs будет доступна и видна дляjarс

2.2. Сборочный плагин Apache Maven

Плагин сборки Apache Maven позволяет пользователям объединять выходные данные проекта вместе с его зависимостями, модулями, документацией сайта и другими файлами в один работающий пакет.

Основная цель плагина сборки - это цельsingle - используется для создания всех сборок (все другие цели устарели и будут удалены в следующем выпуске).

Давайте посмотрим на конфигурацию вpom.xml:


    org.apache.maven.plugins
    maven-assembly-plugin
    
        
            package
            
                single
            
            
                
                
                    
                        org.example.executable.ExecutableMavenJar
                    
                
                
                
                    jar-with-dependencies
                
            
        
    

Как и при ручном подходе, нам нужно предоставить информацию об основном классе; разница в том, что плагин сборки Maven автоматически копирует все необходимые зависимости в файлjar.

В части кода конфигурацииdescriptorRefs мы указали имя, которое будет добавлено к имени проекта.

Выход в нашем примере будет называтьсяcore-java-jar-with-dependencies.jar.

  • pros - зависимости внутри файлаjar, только однофайловые

  • cons - базовый контроль упаковки вашего артефакта, например, нет поддержки перемещения класса

2.3. Плагин Apache Maven Shade

Плагин Apache Maven Shade предоставляет возможность упаковать артефакт вuber-jar, который состоит из всех зависимостей, необходимых для запуска проекта. Более того, он поддерживает затенение - т.е. переименовать - пакеты некоторых зависимостей.

Давайте посмотрим на конфигурацию:


    org.apache.maven.plugins
    maven-shade-plugin
    
        
            
                shade
            
            
                true
                
                    
                        org.example.executable.ExecutableMavenJar
                
            
        
        
    

Есть три основные части этой конфигурации:

Во-первых,<shadedArtifactAttached> отмечает все зависимости, которые должны быть упакованы вjar.

Во-вторых, нам нужно указатьthe transformer implementation; в нашем примере мы использовали стандартный.

Наконец, нам нужно указать основной класс нашего приложения.

Выходной файл будет называтьсяcore-java-0.1.0-SNAPSHOT-shaded.jar, гдеcore-java - это имя нашего проекта, за которым следует версия моментального снимка и имя плагина.

  • pros - зависимости внутри файлаjar, расширенный контроль упаковки вашего артефакта, с затенением и перемещением класса

  • cons - сложная конфигурация (особенно если мы хотим использовать расширенные функции)

2.4. Плагин One Jar Maven

Другой вариант создания исполняемого файлаjar - это проект One Jar.

Это предоставляет настраиваемый загрузчик классов, который знает, как загружать классы и ресурсы из jar-файлов внутри архива, а не изjars в файловой системе.

Давайте посмотрим на конфигурацию:


    com.jolira
    onejar-maven-plugin
    
        
            
                org.example.executable.
                  ExecutableMavenJar
                true
                
                  ${project.build.finalName}.${project.packaging}
                
            
            
                one-jar
            
        
    

Как показано в конфигурации, нам нужно указать основной класс и присоединить все зависимости для сборки, используяattachToBuild= true.

Кроме того, мы должны предоставить выходное имя файла. Более того, цель Maven -one-jar. Обратите внимание, что One Jar - это коммерческое решение, в котором зависимостьjars не будет расширяться в файловую систему во время выполнения.

  • pros - чистая модель делегирования, позволяет классам находиться на верхнем уровне One Jar, поддерживает внешниеjars и может поддерживать собственные библиотеки

  • cons - активно не поддерживается с 2012 г.

2.5. Spring Boot Maven Плагин

Наконец, последнее решение, которое мы рассмотрим, - это подключаемый модуль Spring Boot Maven.

Это позволяет упаковать исполняемые архивыjar илиwar и запустить приложение «на месте».

Для его использования нам нужно использовать как минимум Maven версии 3.2. Подробное описание доступноhere.

Посмотрим на конфигурацию:


    org.springframework.boot
    spring-boot-maven-plugin
    
        
            
                repackage
            
            
                spring-boot
                
                  org.example.executable.ExecutableMavenJar
                
            
        
    

Есть два различия между плагином Spring и другими. Во-первых, цель выполнения называетсяrepackage, а классификатор -spring-boot.

Обратите внимание, что нам не нужно иметь приложение Spring Boot, чтобы использовать этот плагин.

  • pros - зависимости внутри файлаjar, вы можете запускать его в любом доступном месте, расширенный контроль упаковки вашего артефакта, с исключением зависимостей из файлаjar и т. д., упаковкаwar файлы

  • cons - добавляет потенциально ненужные классы, связанные с Spring и Spring Boot

2.6. Веб-приложение с исполняемым Tomcat

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


    org.apache.tomcat.maven
    tomcat7-maven-plugin
    2.0
    
        
            tomcat-run
            
                exec-war-only
            
            package
            
                /
                false
                webapp.jar
                utf-8
            
        
    

goal устанавливается какexec-war-only,path для вашего сервера указывается внутри тегаconfiguration с дополнительными свойствами, такими какfinalName, charset и т. Д. Чтобы построить jar, запуститеman package, что приведет к созданиюwebapp.jar в вашем каталогеtarget. Бежать

Чтобы запустить приложение, просто напишите это в консоли:java -jar target/webapp.jar и попробуйте протестировать его, указавlocalhost:8080 / в браузере.

  • pros - один файл, легко развернуть и запустить

  • cons - размер файла намного больше из-за упаковки встроенного дистрибутива Tomcat в файл war

Обратите внимание, что это последняя версия этого плагина, которая поддерживает сервер Tomcat7. Чтобы избежать ошибок, убедитесь, что в вашей зависимости для сервлетовscope задано какprovided, в противном случае возникнет конфликт вruntime исполняемого файлаjar:


    javax.servlet
    javax.servlet-api
    provided

3. Заключение

В этой статье мы описали множество способов создания исполняемого файлаjar с помощью различных плагинов Maven.

Полную реализацию этого руководства можно найти в проектах Githubthis (executable jar) иthis (executable war).

How to test? Чтобы скомпилировать проект в исполняемый файлjar, запустите Maven с командойmvn clean package.

Надеемся, что эта статья даст вам больше понимания этой темы, и вы найдете предпочтительный подход в зависимости от ваших потребностей.

Одно быстрое заключительное замечание: убедитесь, что лицензии объединяемых вами jar-файлов не запрещают такого рода операции. Как правило, это не так, но над этим стоит подумать.