Создание runnable jar файла с помощью maven

Вернуться назад

3 мая 2018

Понятие runnable jar или uber jar возникает тогда, когда вы задумываетесь о разворачивании вашего проекта на удалённом сервере. У вас должна быть уверенность в том, что в произвольном окружении, где окажется ваше приложение, в classpath будут все необходимые классы из используемых вами библиотек.

Конечно, никакой проблемы нет, если вы вообще не используете сторонние библиотеки. Но я уверен, что всё-таки используете, если только ваш проект не «Hello World».

Чтобы гарантировать наличие нужных версий всех библиотек, нам проще поставлять их вместе с нашим приложением. Для удобства развёртывания все библиотеки можно поместить в один jar-файл. Подробнее о том, что такое jar-архив и как его получить, мы рассматривали в статье Как скомпилировать исходники java вручную.

Рассмотрим конкретный пример. Пусть имеется приложение, которое использует класс StringUtils из популярного проекта Apache commons-lang3:

package ru.devmark;

import org.apache.commons.lang3.StringUtils;

public class Main {

    public static void main(String[] args) {
        System.out.println(StringUtils.isBlank(""));
    }
}

В pom-файле нашего maven-проекта должно быть прописано следующее:

<dependencies>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.5</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <source>1.9</source>
                <target>1.9</target>
            </configuration>
        </plugin>
    </plugins>
</build>

  1. Секция dependencies с указанием всех сторонних зависимостей, используемых в нашем проекте.
  2. Секция build/plugins с указанием стандартного плагина maven-compiler-plugin, в котором указываем целевую версию jdk.

Теперь, если вы выполните команду maven clean package и попробуете запустить полученный jar-файл из папки target через java -jar, по получите сообщение «no main manifest attribute».

Итак, чтобы получить «запускаемый» (runnable) jar со всеми необходимыми библиотеками, нам всего лишь надо расширить секцию build ещё одним плагином от того же Apache под названием shade.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.1.1</version>
    <configuration>
        <transformers>
            <transformer
            implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                <mainClass>ru.devmark.Main</mainClass>
            </transformer>
        </transformers>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Единственное, что здесь надо указать - это параметр mainClass, т.е. тот класс, где находится статический метод main().

Теперь, если ещё раз собрать наш проект, то на выходе вы получите не один, а два jar-файла. Один в несколько килобайт, а другой в несколько раз больше. Если вы откроете через любой архиватор большой jar-файл, то увидите внутри помимо наших классов также и все классы, которые входят в библиотеку common-lang3. Именно этот архив можно запускать из командной строки и он будет корректно работать через java -jar, т.к. содержит все необходимые классы внутри себя.

Тэги: Apache, Java, maven.



Добавить комментарий

Ваше имя:
Текст комментария: