Очень часто в целях тестирования требуется создать простое приложение, которое можно запускать вне какого-либо сервера приложений, просто по команде 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>
<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 и прочие.
Самый часто используемый - это 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 на конце является автономным.
Чтобы не лезть внутрь архивов, вы можете указать, каким суффиксом снабжать runnable jar. В pom.xml за это отвечает секция configuration/shadedClassifierName. В нашем примере указан суффикс executable. Следовательно, файл с executable на конце является автономным.
Комментариев нет:
Отправить комментарий