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

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

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

30 ответов


<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>

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

<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 as OutputDirectory для интеграции всех jar-файлов в основную банку, но затем вам нужно будет добавить пользовательский код загрузки классов для загрузки банок.


я написал в блоге о некоторых различных способах сделать это.

посмотреть исполняемый Jar с Apache Maven (WordPress)

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

Примечания

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


Для Ручного Развертывания

  • плюсы
  • минусы
    • зависимости от окончательного сосуд.

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

<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 и Classpath в курсе

<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 фактически исполняется с внешними элементами classpath.

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

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

на jar файл исполняется только с братом вы 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 Плагин

  • плюсы
  • минусы
<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 Плагин

  • плюсы
  • минусы
    • добавьте потенциальные ненужные весну и весну Связанные классы загрузке.
<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.


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

<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>

используйте 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>

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

<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>

вы можете использовать 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>

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

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


вы можете добавить следующий код пом.в 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 находится. Тогда вы должны выполнить сборка МВН:один и тогда ваш исполняемый файл JAR с зависимостями, надеюсь, будет построен. Вы можете проверить его при переключении в выходной (целевой) каталог с помощью компакт-диск ./ target и начиная банку с командой similiar к java-jar mavenproject1-1.0-SNAPSHOT-jar-with-dependencies.Джар.

при этом Apache Maven 3.0.3.


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

  • на maven-shade-plugin пакеты и все зависимости в один файл jar.
  • настройки maven-jar-plugin чтобы указать основной класс исполняемого jar (см. Настроить Classpath, глава "сделать 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

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

    <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


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

<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>

вот исполняемый плагин jar для Maven, который мы используем в Credit Karma. Он создает банку банок с загрузчиком классов, способным загружать классы из вложенных банок. Это позволяет иметь один и тот же путь к классам в dev и prod и по-прежнему хранить все классы в одном подписанном файле jar.

https://github.com/creditkarma/maven-exec-jar-plugin

и вот сообщение в блоге с подробностями о плагине и почему мы его сделали: https://engineering.creditkarma.com/general-engineering/new-executable-jar-plugin-available-apache-maven/


вы можете использовать плагин 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>

использовать плагин onejar построить его как один исполняемый файл jar, который упаковывает все зависимости коробит в нем. Это решило мою проблему, которая была похожа на эту. Когда использовался плагин сборки, он распаковывал все банки зависимостей в исходную папку и переупаковывал их как банку, он написал все подобные реализации, которые у меня были внутри моего кода, которые имели те же имена классов. onejar-простое решение здесь.


проблема с поиском общего файла сборки с Maven-assembly-plugin-2.2.1?

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

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

посмотреть этой для получения более подробной информации.

класс: орг."Апач".Мэйвен.плагин.сборка.Ио.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>

надо так:

    <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>

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


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

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

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

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

удачной альтернативой :

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

Как это, в конце концов, только манифест и "специальный динамический загрузчик классов main", вы можете начать свой проект с :

java -jar ProjectMainJar.jar com.stackoverflow.projectName.MainDynamicClassLoaderClass

Если вы хотите, если из самой командной строки . Просто запустите команду ниже из пути проекта

сборка mvn: сборка


вы также можете использовать этот плагин, это довольно хорошо, и я использую его для упаковки моих банок http://sonatype.github.io/jarjar-maven-plugin/


что-то, что работал для меня было:

  <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 выполняется в фазе "подготовка пакета" 2) я извлекаю распакованный classess непосредственно в "target/classes"


я попробовал самый проголосованный ответ здесь и смог получить банку runnable. Но программа работала неправильно. Я не знаю, в чем причина. Когда я пытаюсь убежать от 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


это лучший способ я нашел:

  <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 или


для решения этой проблемы мы будем использовать Maven Assembly Plugin, который создаст JAR вместе с его зависимостями JARs в один исполняемый файл 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

http://jkoder.com/maven-creating-a-jar-together-with-its-dependency-jars-into-a-single-executable-jar-file/


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


Это также может быть вариант, вы сможете создать свой файл 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>

Я сравнил Плагины дерева, упомянутые в этом посте. Я создал 2 банки и каталог со всеми банками. Я сравнил результаты и, безусловно, Maven-shade-plugin является лучшим. Моя проблема заключалась в том, что у меня было несколько весенних ресурсов, которые нужно было объединить, а также JAX-rs и JDBC services. Все они были правильно объединены плагином shade по сравнению с плагином Maven-assembly-plugin. В этом случае весна потерпит неудачу, если вы не скопируете их в свою собственную папку ресурсов и объединять их вручную один раз. Оба плагина выводят правильное дерево зависимостей. У меня было несколько областей, таких как test,provide, compile и т. д. тест и предоставленные были пропущены обоими плагинами. Они оба произвели один и тот же манифест, но я смог объединить лицензии с плагином shade, используя их трансформатор. С Maven-dependency-plugin, конечно, у вас нет этих проблем, потому что банки не извлекаются. Но, как и некоторые другие, вы должны нести один дополнительный файл(ы) для работы правильно. Вот кусочек помпона.в 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>

для тех, кто ищет варианты исключения определенных зависимостей из 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, а свойство зависимости.


уже есть миллионы ответов, я хотел добавить, что вам не нужно <mainClass> Если вам не нужно добавлять entryPoint в приложение. например, APIs может не обязательно иметь 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/

добавить в 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 также создаст одну банку жира дополнительно, включая все банки зависимостей.