Мое решение - создать архив (zip или другие форматы), содержащий ваши классы в jar, jar зависимостей, папку с файлами конфигурации времени выполнения и сценариями для запуска приложения.Задача состоит в том, чтобы запустить приложение, готовое к запуску, просто разархивировав архив.
Содержимое встроенного архива:
artifactId-version.zip:
<artifactId folder>
├─ config
| ├─ log4j2.xml
├─ lib
| ├─ <all dependencies jars>
├─ leanft.cmd
├─ leanft.sh
└─ artifactId-version.jar
Вы должны адаптировать решение к тому, что / если вам нужны файлы конфигурации,Вам не нужны папки META-INF с файлами MANIFEST.MF, потому что они будут автоматически создаваться плагином maven.
Структура проекта
<maven_module_root>
├─ src
| ├─ main
| | ├─ assembly
| | | ├─ leanft-assembly.xml
| | ├─ java
| | | ├─ <your classes content>
| | ├─ resources
| | | ├─ log4j2.xml
| | | ├─ <your runtime configuration files>
| | ├─ scripts
| | | ├─ leanft.cmd
| | | ├─ leanft.sh
│ └───test
├─ pom.xml
Структура проекта аналогична вашей текущей структурес двумя дополнительными папками:
- сборка: в этой папке находится файл leanft-assembly.xml для настройки подключаемого модуля maven-assembly.
- скрипты: в этой папке находятся скрипты запуска для вашего приложения.Это необходимо, если вам нужны файлы конфигурации времени выполнения, доступные для редактирования.В моем примере resources / log4j2.xml будет находиться в файле конфигурации, поэтому пользователь может редактировать этот файл, не касаясь jar / архива.
Дескриптор сборки
Решение основано на mavenПлагин сборки с пользовательской конфигурацией.Я рекомендую ознакомиться с ним, начиная с дескриптора дескриптор сборки
Ваш файл leanft-assembly.xml может выглядеть следующим образом:
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
<id>dist</id>
<formats>
<!-- <format>tar.gz</format> -->
<format>zip</format>
</formats>
<includeBaseDirectory>true</includeBaseDirectory>
<baseDirectory>${project.artifactId}</baseDirectory>
<fileSets>
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>${project.artifactId}-${project.version}.jar</include>
</includes>
</fileSet>
<fileSet>
<directory>${project.build.directory}/lib</directory>
<outputDirectory>/lib</outputDirectory>
<includes>
<include>*.*</include>
</includes>
</fileSet>
<fileSet>
<directory>${project.build.outputDirectory}</directory>
<outputDirectory>/config</outputDirectory>
<includes>
<include>log4j2.xml</include>
</includes>
</fileSet>
<fileSet>
<directory>${project.basedir}/src/main/scripts</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>leanft.*</include>
</includes>
</fileSet>
</fileSets>
</assembly>
Maven pom
Наконец, pom.xml использует 3 плагина:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.0.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteIfNewer>true</overWriteIfNewer>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>true</overWriteSnapshots>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>test.LeanFTest</mainClass>
</manifest>
</archive>
<excludes>
<exclude>log4j2.xml</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<finalName>${project.artifactId}-${project.version}</finalName>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>src/main/assembly/leanft-assembly.xml</descriptor>
</descriptors>
</configuration>
</plugin>
Я объясню использование плагинов maven:
- maven-dependency-plugin: скопировать все зависимости на этапе пакета вПапка lib в целевой папке.
- maven-jar-plugin:
- archive: создать файл манифеста, определить в манифесте все зависимости из папки lib и какой основной класс, чтобы вы могли запустить приложение также с"java -jar"
- исключает: не включайте файл log4j2.xml в jar модуля, поскольку он будет находиться в папке config, доступной во время выполнения из внешнего jar.
- maven-assembly-plugin: create at packageсоставьте zip-файл, содержащий ваш дистрибутивАрхив помещается в целевую папку.Тег дескриптора ссылается на файл конфигурации сборки leanft-assembly.xml.
Script
Скрипт для запуска приложения, вызывающий java с предопределенными параметрами, основная строка из скрипта:
%JAVA_HOME%\bin\java %JVM_ARGS% -cp %SCRIPT_DIR%\*;%SCRIPT_DIR%\config\ test.LeanFTest