Как я могу создать исполняемый JAR с зависимостями с помощью Maven?

avatar
soemirno
22 февраля 2009 в 08:43
1536928
32
2634

Я хочу упаковать свой проект в один исполняемый файл JAR для распространения.

Как мне сделать так, чтобы проект Maven упаковал все JAR-файлы зависимостей в выходной JAR-файл?

Источник
Matthew McCullough
11 марта 2009 в 15:11
15

Пожалуйста, объясните, о какой цели плагина зависимостей вы говорите. Я не знаю цели, которая выполняет то, что запрашивает исходный вопрос: поместить все зависимости либо A) в банку авторов посредством переупаковки, либо B) создать исполняемую банку, у которой есть другие в пути к классам MANIFEST.MF

Dan
2 февраля 2015 в 19:01
2

Вы можете найти это полезным rationaljava.com/2015/02/…

Thanga
11 сентября 2017 в 08:18
1

Обратитесь к coderhelper.com/questions/35217128/…

Ответы (32)

avatar
IAdapter
21 февраля 2013 в 08:37
2582
<build>
  <plugins>
    <plugin>
      <artifactId>maven-assembly-plugin</artifactId>
      <configuration>
        <archive>
          <manifest>
            <mainClass>fully.qualified.MainClass</mainClass>
          </manifest>
        </archive>
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
      </configuration>
    </plugin>
  </plugins>
</build>

, и вы запускаете его с

mvn clean compile assembly:single

Цель компиляции должна быть добавлена ​​перед сборкой: одиночный или иначе код вашего собственного проекта не включается.

Подробности смотрите в комментариях.


Обычно эта цель привязана к фазе сборки и выполняется автоматически. Это гарантирует, что JAR создается при выполнении mvn install или выполнении развертывания / выпуска.

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <configuration>
    <archive>
      <manifest>
        <mainClass>fully.qualified.MainClass</mainClass>
      </manifest>
    </archive>
    <descriptorRefs>
      <descriptorRef>jar-with-dependencies</descriptorRef>
    </descriptorRefs>
  </configuration>
  <executions>
    <execution>
      <id>make-assembly</id> <!-- this is used for inheritance merges -->
      <phase>package</phase> <!-- bind to the packaging phase -->
      <goals>
        <goal>single</goal>
      </goals>
    </execution>
  </executions>
</plugin>
Michael
31 мая 2011 в 19:03
25

Спасибо @IAdapter. Обратите внимание, что вы всегда должны выполнять компиляцию перед началом, потому что она просто поместит все, что находится в "target / classes" в JAR. Это гарантирует, что JAR будет включать все изменения, которые вы недавно внесли в исходный код. Итак, вы должны сделать что-то вроде: mvn clean compile assembly:single.

Sahil Dave
23 октября 2013 в 14:55
1

Я связал сборку: единственная цель с фазой пакета в моем проекте pom.xml, но она работает только тогда, когда я выполняю сборку mvn: single из командной строки.

Prashant Vaidyanathan
16 июля 2014 в 02:10
0

Есть ли способ направить <mainClass> в класс в тестовом каталоге? У меня есть основной класс в org.core (структура каталогов существует в основном и тестовом), но maven включает только скомпилированные классы из основного, а не тестового.

Mubasher
18 сентября 2014 в 16:56
0

Можем ли мы использовать этот метод для java fx jar. Наша задача по умолчанию ant jar лучше. Но я сталкиваюсь с проблемами зависимостей с задачей ant jar. См. Мой вопрос coderhelper.com/questions/25915793/…

pitchblack408
7 апреля 2015 в 16:31
3

Я вижу, что это не добавляет банки в банку uber, а просто добавляет все файлы классов в банку.

maxivis
6 мая 2015 в 19:22
195

Совет: вы также можете добавить элемент <appendAssemblyId>false</appendAssemblyId> в configuration, чтобы избежать раздражающего суффикса «-jar-with-dependencies» в имени.

user3774109
9 марта 2017 в 15:07
0

Плагин сборки maven может вызвать некоторые проблемы, потому что может переопределить некоторые зависимости, поэтому я не могу сказать вам использовать его! Вместо этого используйте плагин Maven Shade, который нам очень подходит. Мы потратили несколько дней, чтобы обнаружить, что плагин сборки maven отменяет некоторые зависимости, которые нарушают jar приложения. Посмотрите там: mkyong.com/maven/create-a-fat-jar-file-maven-shade-plugin

Niklas R.
21 ноября 2017 в 21:48
0

8 уровней упаковки - безумие переборщить

Raffi Khatchadourian
1 февраля 2018 в 22:41
1

@maxivis Кажется, это работает, но выдает некоторые предупреждения.

parlad
20 июля 2018 в 11:02
2

что, если у меня нет основного метода или класса, мне просто нужен какой-то случайный файл java, чтобы быть jar?

gerardw
24 октября 2018 в 16:27
0

@parladneupane оставьте часть <a rchive> ... </archive>

user10201743
20 ноября 2018 в 22:04
0

Он не просил использовать плагины, maven должен сам компилировать с зависимостями без странных команд и плагинов.

Adowrath
16 марта 2019 в 18:09
4

@ user10201743 Просто чтобы дать небольшой контекст: Все в Maven - это плагин. Компилятор? maven-compiler-plugin. Тесты? maven-surefire-plugin. Эти два, включая сборку, являются официальными плагинами maven, поэтому их можно также рассматривать как часть maven (особенно потому, что, по крайней мере, сейчас, все три из них находятся в вашем эффективном POM по умолчанию).

Richard Bradley Smith
25 мая 2019 в 01:16
0

Я столкнулся с этим с помощью alexa-skills-kit-sdk-for-java, который работал хорошо до тех пор, пока не появились инструкции по созданию WAR-файла в Maven. В разделе «Развитие вашего первого навыка» говорится, что введите команду строки «mvn org.apache.maven.plugins: maven-assembly-plugin: 2.6: assembly -DdescriptorId = jar-with-dependencies package», которая не работает. Я поместил указанный выше плагин в «самый высокий POM» (ближайший к корневому файлу) и запустил строковую команду «mvn clean compile assembly: single» из этого POM (каталога), и он работал отлично.

Halil İbrahim Oymacı
31 марта 2020 в 09:25
1

Например, если ваш основной путь к классу src/main/java/com/example/ui/Main.java, вы должны написать так в pom.xml: <mainClass>com.example.ui.Main</mainClass>.

Alejandro Gonzalez
22 июля 2020 в 17:53
0

Спасибо, ребята, пригодилось

Jack D Menendez
6 декабря 2020 в 20:05
0

У меня возникли проблемы с этим, потому что я продолжал предпринимать различные попытки с использованием разных плагинов в разделе build pluginManagement plugins вместо плагинов сборки. Конечно, нет никаких сообщений об ошибке, чтобы сообщить вам об этой ошибке.

William Entriken
19 февраля 2021 в 01:07
0

И если вы здесь новичок, вы должны запустить эту новую скомпилированную программу, используя: java -jar target/*with-dependencies.jar, и вы можете добавить любые аргументы командной строки, которые хотите передать своей программе.

Enerccio
28 июня 2021 в 14:57
0

это НЕ исполняемый файл

avatar
Akshay Patel
14 января 2022 в 16:26
0

перепробовали несколько решений, но одно из них отлично сработало в сценарии, где мы хотели создать неисполняемый толстый банк со всеми внутренними зависимостями для внешних систем, не имевших ранее значения. сценарий prod протестирован.

включить это в pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<build>
   <sourceDirectory>src</sourceDirectory>
   <plugins>
      <plugin>
         <artifactId>maven-compiler-plugin</artifactId>
         <version>3.8.1</version>
         <configuration>
            <source>1.8</source>
            <target>1.8</target>
         </configuration>
      </plugin>
      <plugin>
         <artifactId>maven-assembly-plugin</artifactId>
         <configuration>
            <descriptorRefs>
               <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
         </configuration>
      </plugin>
   </plugins>
</build>


Команда для сборки толстой банки->> mvn Assembly:assembly

avatar
uwevil
25 июня 2020 в 12:33
1

Надеюсь, мой опыт может кому-нибудь помочь: я хочу перенести свое приложение Spring (с помощью клиента cas) на Spring Boot (1.5, а не 2.4). Я столкнулся со многими проблемами, такими как:

нет основного атрибута манифеста в target / cas-client-web.jar

Я хочу создать одну уникальную банку со всеми зависимостями. После нескольких дней поисков в Интернете. Я могу выполнить свою работу с помощью этих строк:

         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <fork>true</fork>
                <mainClass>${start-class}</mainClass>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>${start-class}</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
        </plugin>

с start-class ваш основной класс

<properties>
    <java.version>1.8</java.version>
    <start-class>com.test.Application</start-class>
</properties>

А мое Приложение выглядит так:

package com.test;

import java.util.Arrays;

import com.test.TestProperties;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;


@SpringBootApplication
@EnableAutoConfiguration
@EnableConfigurationProperties({TestProperties.class})
public class Application {

public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
}

@Bean
public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
    return args -> {

        System.out.println("Let's inspect the beans provided by Spring Boot:");

        String[] beanNames = ctx.getBeanDefinitionNames();
        Arrays.sort(beanNames);
        for (String beanName : beanNames) {
            System.out.println(beanName);
        }

    };
}

}
avatar
Shang Gao
28 февраля 2019 в 21:47
0
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.4.1</version>
            <configuration>
                <!-- get all project dependencies -->
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <!-- bind to the packaging phase -->
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
avatar
Minisha
26 октября 2017 в 00:57
22

Вы можете использовать плагин maven-shade для создания uber jar, как показано ниже

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
        </execution>
    </executions>
</plugin>
avatar
Aydin K.
21 июня 2017 в 19:35
2

Добавить в pom.xml:

  <dependency>
            <groupId>com.jolira</groupId>
            <artifactId>onejar-maven-plugin</artifactId>
            <version>1.4.4</version>
  </dependency>

и

<plugin>
       <groupId>com.jolira</groupId>
       <artifactId>onejar-maven-plugin</artifactId>
       <version>1.4.4</version>
       <executions>
              <execution>
                     <goals>
                         <goal>one-jar</goal>
                     </goals>
              </execution>
       </executions>
</plugin>

Вот и все. Следующий пакет mvn также дополнительно создаст одну толстую банку, включая все банки зависимостей.

avatar
prayagupd
29 сентября 2016 в 23:27
2

Уже есть миллионы ответов, я хотел добавить, что вам не нужно <mainClass>, если вам не нужно добавлять entryPoint в ваше приложение. Например, API может не обязательно иметь метод main.

конфигурация плагина maven

  <build>
    <finalName>log-enrichment</finalName>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
      </plugin>
    </plugins>
  </build>

сборка

mvn clean compile assembly:single

проверить

ll target/
total 35100
drwxrwx--- 1 root vboxsf     4096 Sep 29 16:25 ./
drwxrwx--- 1 root vboxsf     4096 Sep 29 16:25 ../
drwxrwx--- 1 root vboxsf        0 Sep 29 16:08 archive-tmp/
drwxrwx--- 1 root vboxsf        0 Sep 29 16:25 classes/
drwxrwx--- 1 root vboxsf        0 Sep 29 16:25 generated-sources/
drwxrwx--- 1 root vboxsf        0 Sep 29 16:25 generated-test-sources/
-rwxrwx--- 1 root vboxsf 35929841 Sep 29 16:10 log-enrichment-jar-with-dependencies.jar*
drwxrwx--- 1 root vboxsf        0 Sep 29 16:08 maven-status/
avatar
Anoop Rai
1 сентября 2016 в 10:21
7

Чтобы решить эту проблему, мы будем использовать Maven Assembly Plugin, который создаст JAR вместе с JAR зависимостей в один исполняемый файл JAR. Просто добавьте ниже конфигурацию плагина в свой файл pom.xml.

<build>
   <pluginManagement>
      <plugins>
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
               <archive>
                  <manifest>
                     <addClasspath>true</addClasspath>
                     <mainClass>com.your.package.MainClass</mainClass>
                  </manifest>
               </archive>
               <descriptorRefs>
                  <descriptorRef>jar-with-dependencies</descriptorRef>
               </descriptorRefs>
            </configuration>
            <executions>
               <execution>
                  <id>make-my-jar-with-dependencies</id>
                  <phase>package</phase>
                  <goals>
                     <goal>single</goal>
                  </goals>
               </execution>
            </executions>
         </plugin>
      </plugins>
   </pluginManagement>
</build>

После этого не забудьте запустить инструмент MAVEN с помощью этой команды mvn clean compile assembly: single

avatar
Paul Bormans
3 мая 2016 в 08:09
2

Для тех, кто ищет варианты исключения определенных зависимостей из uber-jar, это решение, которое сработало для меня:

<project...>
<dependencies>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.11</artifactId>
            <version>1.6.1</version>
            <scope>provided</scope> <=============
        </dependency>
</dependencies>
<build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>...</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

Значит, это не конфигурация плагина mvn-assembly-plugin, а свойство зависимости.

avatar
Fabio
24 февраля 2016 в 18:12
3

Я сравнил плагины дерева, упомянутые в этом посте. Я создал 2 баночки и каталог со всеми банками. Я сравнил результаты и определенно лучший плагин maven-shade. Моя проблема заключалась в том, что у меня есть несколько ресурсов Spring, которые необходимо объединить, а также службы jax-rs и JDBC. Все они были правильно объединены плагином тени по сравнению с плагином maven-assembly-plugin. В этом случае пружина не сработает, если вы не скопируете их в свою папку ресурсов и не объедините вручную один раз. Оба плагина выводят правильное дерево зависимостей. У меня было несколько областей, таких как тест, предоставление, компиляция и т. Д., Тест и предоставленные были пропущены обоими плагинами. Они оба создали один и тот же манифест, но я смог объединить лицензии с плагином шейдера, используя их преобразователь. С плагином maven-dependency-plugin, конечно, у вас нет этих проблем, потому что банки не извлекаются. Но, как указали некоторые другие, для правильной работы вам необходимо иметь с собой один дополнительный файл (ы). Вот фрагмент файла pom.xml

            <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        <includeScope>compile</includeScope>
                        <excludeTransitive>true</excludeTransitive>
                        <overWriteReleases>false</overWriteReleases>
                        <overWriteSnapshots>false</overWriteSnapshots>
                        <overWriteIfNewer>true</overWriteIfNewer>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>com.rbccm.itf.cdd.poller.landingzone.LandingZonePoller</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-my-jar-with-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.3</version>
            <configuration>
                <shadedArtifactAttached>false</shadedArtifactAttached>
                <keepDependenciesWithProvidedScope>false</keepDependenciesWithProvidedScope>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                        <resource>META-INF/services/javax.ws.rs.ext.Providers</resource>
                    </transformer>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                        <resource>META-INF/spring.factories</resource>
                    </transformer>
                    <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>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                        <resource>META-INF/spring.tooling</resource>
                    </transformer>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"/>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer">
                    </transformer>
                </transformers>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
avatar
salmanbw
25 ноября 2015 в 10:40
2

Это также может быть вариант, вы сможете создать свой файл jar

<build>
    <plugins>
        <plugin>
            <!-- Build an executable JAR -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <mainClass>WordListDriver</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>
avatar
dsutherland
23 ноября 2015 в 20:28
14

Я просмотрел все эти ответы, пытаясь создать толстый исполняемый файл jar, содержащий все зависимости, и ни один из них не работал правильно. Ответ - плагин тени, он очень простой и понятный.

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <version>2.3</version>
      <executions>
         <!-- Run shade goal on package phase -->
        <execution>
        <phase>package</phase>
        <goals>
            <goal>shade</goal>
        </goals>
        <configuration>
          <transformers>
             <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                <mainClass>path.to.MainClass</mainClass>
             </transformer>
          </transformers>
        </configuration>
          </execution>
      </executions>
    </plugin>

Имейте в виду, что ваши зависимости должны иметь область компиляции или времени выполнения, чтобы это работало должным образом.

Этот пример взят с сайта mkyong.com

avatar
Jan Ziegler
27 мая 2015 в 15:21
1

В этом сообщении блога показан другой подход с объединением подключаемых модулей maven-jar и maven-assembly. С помощью XML-файла конфигурации сборки из сообщения в блоге также можно контролировать, будут ли зависимости расширяться или просто собираться в папке и на которые ссылается запись пути к классам в манифесте:

Идеальное решение - включить jar-файлы в папку lib, а файл manifest.mf основного jar-файла включает все jar-файлы в пути к классам.

И именно он описан здесь: https://caffebig.wordpress.com/2013/04/05/executable-jar-file-with-dependent-jars-using-maven/

avatar
EliuX
9 марта 2015 в 22:22
3

Это лучший способ, который я нашел:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.4</version>
    <configuration>
      <archive>
        <manifest>
        <addClasspath>true</addClasspath>
        <mainClass>com.myDomain.etc.MainClassName</mainClass>
        <classpathPrefix>dependency-jars/</classpathPrefix>
        </manifest>
      </archive>
    </configuration>
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.5.1</version>
    <executions>
      <execution>
        <id>copy-dependencies</id>
        <phase>package</phase>
        <goals>
            <goal>copy-dependencies</goal>
        </goals>
        <configuration>
            <outputDirectory>
               ${project.build.directory}/dependency-jars/
            </outputDirectory>
        </configuration>
      </execution>
    </executions>
  </plugin>

В этой конфигурации все зависимости будут расположены в /dependency-jars. В моем приложении нет класса Main, только контекстные, но одна из моих зависимостей имеет класс Main (com.myDomain.etc.MainClassName), который запускает сервер JMX и получает параметр start или stop. Итак, с этим я смог запустить свое приложение следующим образом:

java -jar ./lib/TestApp-1.0-SNAPSHOT.jar start

Жду, он вам всем пригодится.

avatar
mycowan
13 февраля 2015 в 00:51
-2

Хорошо, это мое решение. Я знаю, что он не использует файл pom.xml. Но у меня возникла проблема с компиляцией и запуском моей программы на Netbeans, но она не удалась, когда я попробовал Java -jar MyJarFile.jar. Теперь я не совсем понимаю Maven, и я думаю, что именно поэтому возникли проблемы с тем, чтобы Netbeans 8.0.2 включил мой файл jar в библиотеку, чтобы поместить их в файл jar. Я думал о том, как я использовал файлы jar без Maven в Eclipse.

Это Maven, который может компилировать все зависимости и плагины. Не Netbeans. (Если вы можете получить Netbeans и использовать для этого java .jar, расскажите мне, как (^. ^) V)

[Решено - для Linux], открыв терминал.

Тогда

cd /MyRootDirectoryForMyProject

Далее

mvn org.apache.maven.plugins:maven-compiler-plugin:compile

Далее

mvn install

Это создаст файл jar в целевом каталоге.

MyJarFile-1.0-jar-with-dependencies.jar

Сейчас

cd target

(вам может потребоваться запустить: chmod +x MyJarFile-1.0-jar-with-dependencies.jar)

И, наконец,

java -jar MyJarFile-1.0-jar-with-dependencies.jar

См.

https://cwiki.apache.org/confluence/display/MAVEN/LifecyclePhaseNotFoundException

Я опубликую это решение на нескольких других страницах с аналогичной проблемой. Надеюсь, я смогу спасти кого-нибудь от недели разочарований.

rjdkolb
2 ноября 2015 в 10:45
2

Попробуйте открыть проект Maven, созданный с помощью Netbeans. Основное правило Netbeans - всегда создавать проект Maven, а не «приложение Java». Добавьте плагин maven-shade, как один из ответов. Работает как шарм.

avatar
Rocky Inde
10 октября 2014 в 22:11
2

Я попробовал здесь ответ, получивший наибольшее количество голосов, и смог запустить jar. Но программа работала некорректно. Не знаю, в чем была причина. Когда я пытаюсь запустить из Eclipse, я получаю другой результат, но когда я запускаю jar из командной строки, я получаю другой результат (он вылетает из-за ошибки времени выполнения программы).

У меня было такое же требование, что и у OP, только у меня было слишком много (Maven) зависимостей для моего проекта. К счастью, единственное решение, которое сработало для меня, было использование Eclipse. Очень просто и понятно. Это не решение OP, но решение для тех, у кого есть аналогичные требования, но со многими зависимостями Maven,

1) Просто щелкните правой кнопкой мыши папку проекта (в Eclipse) и выберите Export

2) Затем выберите Java -> Runnable Jar

3) Вам будет предложено выбрать расположение файла jar

4) Наконец, выберите класс, у которого есть метод Main, который вы хотите запустить, выберите Package dependencies with the Jar file и щелкните Finish

avatar
Jin Kwon
2 июня 2014 в 03:01
268

См. исполняемый файл-jar-with-maven-example (GitHub)

Примечания

Эти плюсы и минусы предоставлены Стефаном.


Для развертывания вручную

  • Плюсы
  • Минусы
    • Зависимости вышли из финального файла jar.

Копировать зависимости в определенный каталог

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <executions>
    <execution>
      <id>copy-dependencies</id>
      <phase>prepare-package</phase>
      <goals>
        <goal>copy-dependencies</goal>
      </goals>
      <configuration>
        <outputDirectory>${project.build.directory}/${project.build.finalName}.lib</outputDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>

Сделать исполняемый файл Jar и путь к классам осведомленным

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <configuration>
    <archive>
      <manifest>
        <addClasspath>true</addClasspath>
        <classpathPrefix>${project.build.finalName}.lib/</classpathPrefix>
        <mainClass>${fully.qualified.main.class}</mainClass>
      </manifest>
    </archive>
  </configuration>
</plugin>

На этом этапе jar фактически исполняется с элементами внешнего пути к классам.

$ java -jar target/${project.build.finalName}.jar

Сделать развертываемые архивы

Файл jar исполняется только в родственном каталоге ...lib/. Нам нужно сделать архивы для развертывания с каталогом и его содержимым.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-antrun-plugin</artifactId>
  <executions>
    <execution>
      <id>antrun-archive</id>
      <phase>package</phase>
      <goals>
        <goal>run</goal>
      </goals>
      <configuration>
        <target>
          <property name="final.name" value="${project.build.directory}/${project.build.finalName}"/>
          <property name="archive.includes" value="${project.build.finalName}.${project.packaging} ${project.build.finalName}.lib/*"/>
          <property name="tar.destfile" value="${final.name}.tar"/>
          <zip basedir="${project.build.directory}" destfile="${final.name}.zip" includes="${archive.includes}" />
          <tar basedir="${project.build.directory}" destfile="${tar.destfile}" includes="${archive.includes}" />
          <gzip src="${tar.destfile}" destfile="${tar.destfile}.gz" />
          <bzip2 src="${tar.destfile}" destfile="${tar.destfile}.bz2" />
        </target>
      </configuration>
    </execution>
  </executions>
</plugin>

Теперь у вас есть target/${project.build.finalName}.(zip|tar|tar.bz2|tar.gz), каждый из которых содержит jar и lib/*.


Плагин сборки Apache Maven

  • Плюсы
  • Минусы
    • Нет поддержки перемещения класса (используйте maven-shade-plugin, если требуется перемещение класса).
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>single</goal>
      </goals>
      <configuration>
        <archive>
          <manifest>
            <mainClass>${fully.qualified.main.class}</mainClass>
          </manifest>
        </archive>
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
      </configuration>
    </execution>
  </executions>
</plugin>

У вас есть target/${project.bulid.finalName}-jar-with-dependencies.jar.


Плагин Apache Maven Shade

  • Плюсы
  • Минусы
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <executions>
    <execution>
      <goals>
        <goal>shade</goal>
      </goals>
      <configuration>
        <shadedArtifactAttached>true</shadedArtifactAttached>
        <transformers>
          <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
            <mainClass>${fully.qualified.main.class}</mainClass>
          </transformer>
        </transformers>
      </configuration>
    </execution>
  </executions>
</plugin>

У вас есть target/${project.build.finalName}-shaded.jar.


плагин onejar-maven

  • Плюсы
  • Минусы
    • Активно не поддерживается с 2012 года.
<plugin>
  <!--groupId>org.dstovall</groupId--> <!-- not available on the central -->
  <groupId>com.jolira</groupId>
  <artifactId>onejar-maven-plugin</artifactId>
  <executions>
    <execution>
      <configuration>
        <mainClass>${fully.qualified.main.class}</mainClass>
        <attachToBuild>true</attachToBuild>
        <!-- https://code.google.com/p/onejar-maven-plugin/issues/detail?id=8 -->
        <!--classifier>onejar</classifier-->
        <filename>${project.build.finalName}-onejar.${project.packaging}</filename>
      </configuration>
      <goals>
        <goal>one-jar</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Плагин Spring Boot Maven

  • Плюсы
  • Минусы
    • Добавить потенциально ненужные классы, связанные с Spring и Spring Boot.
<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <executions>
    <execution>
      <goals>
        <goal>repackage</goal>
      </goals>
      <configuration>
        <classifier>spring-boot</classifier>
        <mainClass>${fully.qualified.main.class}</mainClass>
      </configuration>
    </execution>
  </executions>
</plugin>

У вас есть target/${project.bulid.finalName}-spring-boot.jar.

avatar
fascynacja
24 сентября 2013 в 16:11
3

Что-то, что помогло мне, было:

  <plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
      <execution>
        <id>unpack-dependencies</id>
        <phase>prepare-package</phase>
        <goals>
          <goal>unpack-dependencies</goal>
        </goals>
        <configuration>
          <outputDirectory>${project.build.directory}/classes</outputDirectory>
        </configuration>
      </execution>

    </executions>
  </plugin>


  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <executions>
      <execution>
        <id>unpack-dependencies</id>
        <phase>package</phase>
      </execution>
    </executions>
    <configuration>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
          <classpathPrefix>lib/</classpathPrefix>
          <mainClass>SimpleKeyLogger</mainClass>
        </manifest>
      </archive>
    </configuration>
  </plugin>

У меня был необычный случай, потому что моя зависимость была системной:

<dependency>
  ..
  <scope>system</scope>
  <systemPath>${project.basedir}/lib/myjar.jar</systemPath>
</dependency>

Я изменил код, предоставленный @ user189057, с изменениями: 1) maven-dependency-plugin выполняется на этапе "prepare-package" 2) Я извлекаю распакованные классы прямо в "target / classes"

avatar
Chris
24 мая 2013 в 19:42
1

Плагин maven-assembly-plugin у меня отлично поработал. Я часами работал с плагином maven-dependency-plugin и не мог заставить его работать. Основная причина заключалась в том, что мне пришлось явно указать в разделе конфигурации элементы артефактов, которые должны быть включены, как описано в документации. Там есть пример для случаев, когда вы хотите использовать его, например: mvn dependency:copy, где нет никаких артефактов, но он не работает.

avatar
marioosh
13 марта 2012 в 20:55
21

Долгое время использовал плагин сборки maven , но я не мог найти решения проблемы с "already added, skipping". Теперь я использую другой плагин - onejar-maven-plugin. Пример ниже (mvn package сборка jar):

<plugin>
    <groupId>org.dstovall</groupId>
    <artifactId>onejar-maven-plugin</artifactId>
    <version>1.3.0</version>
    <executions>
        <execution>
            <configuration>
                <mainClass>com.company.MainClass</mainClass>
            </configuration>
            <goals>
                <goal>one-jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Вам необходимо добавить репозиторий для этого плагина:

<pluginRepositories>
    <pluginRepository>
        <id>onejar-maven-plugin.googlecode.com</id>
        <url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url>
    </pluginRepository>
</pluginRepositories>
avatar
Oliver
26 ноября 2011 в 14:17
13

Вы можете объединить maven-shade-plugin и maven-jar-plugin.

  • maven-shade-plugin объединяет ваши классы и все зависимости в один файл jar.
  • Настройте maven-jar-plugin, чтобы указать основной класс исполняемого файла jar (см. Настройка пути к классам, глава «Создание исполняемого файла Jar»).

Пример конфигурации POM для maven-jar-plugin:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>com.example.MyMainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

Наконец, создайте исполняемый файл jar, вызвав:

mvn clean package shade:shade
Chadwick
27 февраля 2012 в 21:35
4

Плагин Shade теперь имеет средства указания записи Main-Class в манифесте: maven.apache.org/plugins/maven-shade-plugin/examples/…

avatar
Benny Neugebauer
13 августа 2011 в 18:23
16

Вы можете добавить следующее в свой pom.xml :

<build>
<defaultGoal>install</defaultGoal>
<plugins>
  <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.3.2</version>
    <configuration>
      <source>1.6</source>
      <target>1.6</target>
    </configuration>
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.3.1</version>
    <configuration>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
          <mainClass>com.mycompany.package.MainClass</mainClass>
        </manifest>
      </archive>
    </configuration>
  </plugin>
  <plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
      <archive>
        <manifest>
          <mainClass>com.mycompany.package.MainClass</mainClass>
        </manifest>
      </archive>
    </configuration>
    <executions>
      <execution>
        <id>make-my-jar-with-dependencies</id>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
</plugins>
</build>

После этого вы должны переключиться через консоль в каталог, где находится pom.xml. Затем вам нужно выполнить mvn assembly: single , и тогда ваш исполняемый файл JAR с зависимостями, надеюсь, будет собран. Вы можете проверить это при переключении в выходной (целевой) каталог с помощью cd ./target и запуске вашего jar с помощью команды, аналогичной java -jar mavenproject1-1.0-SNAPSHOT-jar-with-dependencies .jar .

Я тестировал это с Apache Maven 3.0.3 .

avatar
Rostislav Stříbrný
13 марта 2011 в 11:40
8

Проблема с поиском совместно используемого файла сборки с помощью maven-assembly-plugin-2.2.1?

Попробуйте использовать параметр конфигурации descriptorId вместо параметров descriptor / descriptor или descriptorRefs / descriptorRef.

Ни один из них не делает того, что вам нужно: ищите файл в пути к классам. Конечно, вам нужно добавить пакет, в котором общая сборка находится в пути к классам maven-assembly-plugin (см. Ниже). Если вы используете Maven 2.x (не Maven 3.x), вам может потребоваться добавить эту зависимость в самый верхний родительский файл pom.xml в разделе pluginManagement.

Подробнее см. в этом.

Класс: org.apache.maven.plugin.assembly.io.DefaultAssemblyReader

Пример:

        <!-- Use the assembly plugin to create a zip file of all our dependencies. -->
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.2.1</version>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <configuration>
                        <descriptorId>assembly-zip-for-wid</descriptorId>
                    </configuration>
                </execution>
            </executions>
            <dependencies>
                <dependency>
                    <groupId>cz.ness.ct.ip.assemblies</groupId>
                    <artifactId>TEST_SharedAssemblyDescriptor</artifactId>
                    <version>1.0.0-SNAPSHOT</version>
                </dependency>
            </dependencies>
        </plugin>
avatar
André Aronsen
1 декабря 2010 в 10:46
374

Вы можете использовать подключаемый модуль зависимостей для создания всех зависимостей в отдельном каталоге до фазы пакета, а затем включить это в путь к классам манифеста:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
                <overWriteReleases>false</overWriteReleases>
                <overWriteSnapshots>false</overWriteSnapshots>
                <overWriteIfNewer>true</overWriteIfNewer>
            </configuration>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
                <mainClass>theMainClass</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

В качестве альтернативы используйте ${project.build.directory}/classes/lib в качестве OutputDirectory для интеграции всех jar-файлов в основную jar, но тогда вам нужно будет добавить собственный код загрузки классов для загрузки jar-файлов.

avatar
Vijay Katam
22 сентября 2010 в 15:20
100

Используйте maven-shade-plugin, чтобы упаковать все зависимости в один uber-jar. Его также можно использовать для создания исполняемого файла jar, указав основной класс. После попытки использовать maven-assembly и maven-jar я обнаружил, что этот плагин лучше всего соответствует моим потребностям.

Я нашел этот плагин особенно полезным, поскольку он объединяет содержимое определенных файлов вместо их перезаписи. Это необходимо, когда в банках есть файлы ресурсов с одинаковыми именами и плагин пытается упаковать все файлы ресурсов

См. Пример ниже

      <plugins>
    <!-- This plugin provides the capability to package the artifact in an uber-jar, including its dependencies and to shade - i.e. rename - the packages of some of the dependencies. -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>1.4</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <artifactSet>
                        <!-- signed jars-->
                            <excludes>
                                <exclude>bouncycastle:bcprov-jdk15</exclude>
                            </excludes>
                        </artifactSet>

                         <transformers>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <!-- Main class -->
                                <mainClass>com.main.MyMainClass</mainClass>
                            </transformer>
                            <!-- Use resource transformers to prevent file overwrites -->
                            <transformer 
                                 implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>properties.properties</resource>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
                                <resource>applicationContext.xml</resource>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/cxf/cxf.extension</resource>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
                                <resource>META-INF/cxf/bus-extensions.xml</resource>
                            </transformer>
                     </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>

    </plugins>
avatar
Mayank
14 сентября 2010 в 04:37
5

Чтобы создать исполняемый файл JAR из самой командной строки, просто выполните следующую команду из пути к проекту:

mvn assembly:assembly
Sridhar Sarnobat
8 сентября 2017 в 18:59
5

Я думаю, вам все еще нужно что-то сделать в pom.xml, иначе вы получите Error reading assemblies: No assembly descriptors found.. В любом случае, это то, что происходит со мной.

avatar
kac-ani
5 марта 2010 в 15:39
10

Должно быть так:

<plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>unpack-dependencies</id>
            <phase>generate-resources</phase>
            <goals>
                <goal>unpack-dependencies</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Распаковка должна происходить в фазе создания ресурсов, потому что, если она находится в фазе пакета, она не будет включена в качестве ресурсов. Попробуйте чистый пакет, и вы увидите.

MoHaN K RaJ
15 декабря 2020 в 12:34
0

Получение этой проблемы: org.apache.maven.lifecycle.LifecycleExecutionException: не удалось выполнить цель org.apache.maven.plugins: maven-dependency-plugin: 3.1.2: unpack-dependencies (unpack-dependencies) в службах проекта: неизвестный архиватор тип

avatar
SRG
28 декабря 2009 в 16:43
5

Я не буду отвечать прямо на этот вопрос, поскольку другие уже делали это раньше, но мне действительно интересно, стоит ли встраивать все зависимости в саму jar проекта.

Я вижу суть (простота развертывания / использования), но это зависит от варианта использования вашего проекта (и могут быть альтернативы (см. Ниже)).

Если вы используете его полностью автономно, почему бы и нет.

Но если вы используете свой проект в другом контексте (например, в веб-приложении или перетаскиваете в папку, где находятся другие банки), у вас могут быть дубликаты банок в пути к классам (те, что в папке, те, что в банках ). Может быть, это и не сделка ставки, но я обычно этого избегаю.

Хорошая альтернатива:

  • разверните ваше приложение как .zip / .war: архив содержит jar-файл вашего проекта и все зависимые jar-файлы;
  • используйте механизм динамического загрузчика классов (см. Spring, или вы можете легко сделать это самостоятельно), чтобы иметь одну точку входа в ваш проект (один класс для запуска - см. Механизм манифеста в другом ответе), который будет добавлять (динамически ) к текущему пути к классам все остальные необходимые jar-файлы.

Таким образом, имея в конце только манифест и «специальный динамический загрузчик классов main», вы можете начать свой проект с:

java -jar ProjectMainJar.jar com.coderhelper.projectName.MainDynamicClassLoaderClass
avatar
user189057
13 октября 2009 в 12:16
19

Вы можете использовать maven-dependency-plugin, но вопрос заключался в том, как создать исполняемый JAR. Для этого требуется следующее изменение ответа Мэтью Франглена (кстати, использование плагина зависимостей требует больше времени для сборки при запуске с чистой цели):

<build>
    <plugins>
        <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>fully.qualified.MainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>unpack-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>unpack-dependencies</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
    <resources>
        <resource>
            <directory>${basedir}/target/dependency</directory>
        </resource>
    </resources>
</build>
avatar
Matthew Franglen
9 сентября 2009 в 13:37
10

На мой взгляд, Кен Лю прав. Плагин зависимостей maven позволяет расширять все зависимости, которые затем можно рассматривать как ресурсы. Это позволяет включать их в основной артефакт . Использование плагина сборки создает вторичный артефакт, который может быть сложно изменить - в моем случае я хотел добавить пользовательские записи манифеста. Мой pom оказался таким:

<project>
 ...
 <build>
  <plugins>
   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
     <execution>
      <id>unpack-dependencies</id>
      <phase>package</phase>
      <goals>
       <goal>unpack-dependencies</goal>
      </goals>
     </execution>
    </executions>
   </plugin>
  </plugins>
  ...
  <resources>
   <resource>
    <directory>${basedir}/target/dependency</directory>
    <targetPath>/</targetPath>
   </resource>
  </resources>
 </build>
 ...
</project>
avatar
Matthew McCullough
11 марта 2009 в 15:12
16

Другой вариант, если вы действительно хотите переупаковать содержимое других JAR-файлов внутри единственного результирующего JAR-файла, - это плагин Maven Assembly. Он распаковывает, а затем переупаковывает все в каталог через <unpack>true</unpack>. Затем у вас будет второй проход, который объединит его в один массивный JAR.

Другой вариант - плагин OneJar. Это выполнит указанные выше действия по переупаковке за один шаг.

avatar
Matthew McCullough
26 февраля 2009 в 04:31
147

Взяв ответ без ответа и переформатировав его, мы получим:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>fully.qualified.MainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
        </plugin>
    </plugins>
</build>

Далее, я бы порекомендовал сделать это естественной частью вашей сборки, а не явным вызовом. Чтобы сделать это неотъемлемой частью вашей сборки, добавьте этот плагин в свой pom.xml и привяжите его к событию жизненного цикла package. Однако проблема заключается в том, что вам нужно вызвать цель assembly:single, если поместить это в свой pom.xml, в то время как вы должны вызвать 'assembly: assembly', если выполняете его вручную из командной строки.

<project>
  [...]
  <build>
      <plugins>
          <plugin>
              <artifactId>maven-assembly-plugin</artifactId>
              <configuration>
                  <archive>
                      <manifest>
                          <addClasspath>true</addClasspath>
                          <mainClass>fully.qualified.MainClass</mainClass>
                      </manifest>
                  </archive>
                  <descriptorRefs>
                      <descriptorRef>jar-with-dependencies</descriptorRef>
                  </descriptorRefs>
              </configuration>
              <executions>
                  <execution>
                      <id>make-my-jar-with-dependencies</id>
                      <phase>package</phase>
                      <goals>
                          <goal>single</goal>
                      </goals>
                  </execution>
              </executions>
          </plugin>
      [...]
      </plugins>
    [...]
  </build>
</project>