Создание нескольких исполняемых Jar файлов (с включенными зависимостями) из одного проекта Maven
У меня есть один проект Maven, который имеет несколько основных классов. Я хочу создать из этого проекта исполняемые файлы Jar (которые включают все зависимости). В настоящее время у меня есть следующая конфигурация сборки (с использованием maven.assembly):
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>classpath.to.my.mainClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
Это способ достичь этого с помощью Maven-сборки? Если нет, то как проще всего достичь моей цели?
Ответы
Ответ 1
Я не смог решить эту проблему с maven-assembly-plugin
удовлетворительным образом, поэтому я пошел на другое решение. Я использовал onejar-maven-plugin:
<build>
<plugins>
<plugin>
<groupId>org.dstovall</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<version>1.4.4</version>
<executions>
<execution>
<id>build-first</id>
<configuration>
<mainClass>classpath.to.first.Main</mainClass>
<attachToBuild>true</attachToBuild>
<classifier>onejar</classifier>
<filename>first-runnable.jar</filename>
</configuration>
<goals>
<goal>one-jar</goal>
</goals>
</execution>
<execution>
<id>build-second</id>
<configuration>
<mainClass>classpath.to.second.Main</mainClass>
<attachToBuild>true</attachToBuild>
<classifier>onejar</classifier>
<filename>second-runnable.jar</filename>
</configuration>
<goals>
<goal>one-jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<pluginRepositories>
<pluginRepository>
<id>onejar-maven-plugin.googlecode.com</id>
<url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url>
</pluginRepository>
</pluginRepositories>
Ответ 2
Вы можете это сделать. Вам понадобится отдельное исполнение для каждого создаваемого вами артефакта (т.е. Укажите каждый свой идентификатор, но вы можете оставить фазу по умолчанию), и вам нужно будет указать finalName и archive/manifest/mainClass для каждого.
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>build-a</id>
<configuration>
<archive>
<manifest>
<mainClass>foobar.Aclass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<finalName>foobar_a.jar</finalName>
</configuration>
</execution>
<execution>
<id>build-b</id>
<configuration>
<archive>
<manifest>
<mainClass>foobar.Bclass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<finalName>foobar_b.jar</finalName>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Ответ 3
Верхний ответ работает, если вы не используете какую-либо конфигурацию (или какой-либо ресурс, если на то пошло), который входит в ваш файл jar (например, конфигурация для Spring Автоматические привязки к структуре).
К счастью, это решение также работает с maven-shade-plugin
, и у вас нет этой проблемы с onejar-maven-plugin
.
Кроме того, поддерживается maven-shade-plugin
в отличие от onejar-maven-plugin
, который находится в чистилище, это googlecode.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.1</version>
<executions>
<execution>
<id>build-first</id>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>classpath.to.first.Main</mainClass>
</transformer>
</transformers>
<finalName>first-runnable</finalName>
</configuration>
</execution>
<execution>
<id>build-second</id>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>classpath.to.second.Main</mainClass>
</transformer>
</transformers>
<finalName>second-runnable</finalName>
</configuration>
</execution>
</executions>
</plugin>
Ответ 4
Чтобы указать немного более предыдущий ответ, который мне очень помог,
вам нужно добавить фазовый пакет и сборку целей и запустить mvn run clean package, pom выглядит следующим образом:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>build-a</id>
<configuration>
<archive>
<manifest>
<mainClass>firstMainClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<finalName>a.jar</finalName>
</configuration>
<phase>package</phase>
<goals>
<goal>assembly</goal>
</goals>
</execution>
<execution>
<id>build-b</id>
<configuration>
<archive>
<manifest>
<mainClass>SecondMainClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<finalName>b.jar</finalName>
</configuration>
<phase>package</phase>
<goals>
<goal>assembly</goal>
</goals>
</execution>
</executions>
</plugin>