24 мая 2013 г.

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

Очень часто в целях тестирования требуется создать простое приложение, которое можно запускать вне какого-либо сервера приложений, просто по команде java -jar. Для этого нам нужно создать runnable jar файл, в который уже будут интегрированы все необходимые нам библиотеки. Чтобы не делать этого вручную, воспользуемся плагином maven-shade-plugin. В pom.xml добавим следующую секцию:

<build>
<plugins>
    <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.6</source>
            <target>1.6</target>
        </configuration>
    </plugin>
    <plugin>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.0</version>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>shade</goal>
                </goals>
                <configuration>
                    <transformers>
                        <transformer
                                implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                            <mainClass>ru.blogspot.developer.remarks.MainClass</mainClass>
                        </transformer>
                    </transformers>
                    <shadedArtifactAttached>true</shadedArtifactAttached>
                    <shadedClassifierName>executable</shadedClassifierName>
                </configuration>
            </execution>
        </executions>
    </plugin>
</plugins>
</build>

Можете копировать её целиком. Единственное, на что здесь следует обратить внимание - это секция transformers. В ней вы можете указывать все необходимые трансформеры.

Самый часто используемый - это ManifestResourceTransformer. Он необходим для того, чтобы в манифесте runnable jar файла был указан класс со статическим методом main. Как вы знаете, именно он запускается при старте приложения. В элементе mainClass следует указать полное имя класса с main-методом. В приведённом выше примере указан класс ru.blogspot.developer.remarks.MainClass - просто замените его на свой.

Поскольку runnable jar включает в себя все необходимые для запуска библиотеки, может случиться так, что в нескольких из них будут конфигурационные файлы с одинаковым именем. Если не предпринять специальных действий, в целевом jar-файле у нас окажется только часть необходимого контента. К счастью, есть специальный трансформер AppendingTransformer. Если в библиотеках встречаются несколько файлов с одинаковым именем, в runnable jar файле они будут слиты в один файл с тем же именем.

Важно, если вы используете Spring! Там есть библиотеки, которые содержат файлы с одинаковыми именами spring.handlers и spring.schemas. Чтобы обработать их правильно, добавьте в секцию transformers ещё два элемента:

<transformer
        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
    <resource>META-INF/spring.handlers</resource>
</transformer>
<transformer
        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
    <resource>META-INF/spring.schemas</resource>
</transformer>

На самом деле трансформеров гораздо больше. Полный их перечень вы можете найти на официальной странице. Там есть специальные обработчики для таких файлов, как licence, notice, components.xml, plugin.xml и прочие.

Теперь соберём наше приложения. Выполните цель mvn:install. В папке target вы получите два архива. Понять, какой из этих файлов можно запускать автономно, можно прежде всего по размеру (автономный значительно больше), а также по наличию в файле META-INF/MANIFEST.MF внутри архива строки "Main-Class: ru.blogspot.developer.remarks.SshManager".

Чтобы не лезть внутрь архивов, вы можете указать, каким суффиксом снабжать runnable jar. В pom.xml за это отвечает секция configuration/shadedClassifierName. В нашем примере указан суффикс executable. Следовательно, файл с executable на конце является автономным.

Комментариев нет:

Отправить комментарий