34 Вопрос: Как я могу создать исполняемый JAR с зависимостями, используя Maven?

вопрос создан в Thu, May 31, 2018 12:00 AM

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

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

    
2180
  1. Пожалуйста, объясните, на какую цель плагина зависимостей вы ссылаетесь. Я не знаю ни одной цели, которая бы выполняла то, что требует исходный вопрос: поместить все зависимости либо A) в jar авторов через переупаковку, либо B) создать исполняемый jar, в котором остальные находятся в пути к классам MANIFEST.MF
    2009-03-11 15: 11: 50Z
  2. Вы можете найти это полезным рациональный java.com/2015/02/…
    2015-02-02 19: 01: 54Z
  3. 2017-03-30 06: 54: 18Z
  4. 2017-09-11 08: 18: 16Z
30 ответов                              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>
    
2128
2013-02-21 08: 37: 32Z
  1. Спасибо @IAdapter. Обратите внимание, что вы всегда должны делать компиляцию перед рукой, потому что она просто поместит все, что находится в "target /classes" в JAR. Это обеспечит включение в JAR любых изменений, которые вы недавно внесли в исходный код. Итак, вы должны сделать что-то вроде: mvn clean compile assembly:single.
    2011-05-31 19: 03: 33Z
  2. Я отредактировал вопрос, включив в него привязку фазы. Я удалил устаревшую цель сборки, потому что никто не должен знать об этом.
    2013-02-21 08: 38: 26Z
  3. Я вижу, что это не добавляет баночки в банку uber, а просто добавляет все файлы классов в банку.
    2015-04-07 16: 31: 12Z
  4. Совет: вы также можете добавить элемент <appendAssemblyId>false</appendAssemblyId> в configuration, чтобы избежать раздражающего суффикса "-jar-with-dependencies" в имени
    2015-05-06 19: 22: 29Z
  5. забудьте compile и вы облажались.
    2016-11-13 00: 44: 06Z

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

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

    
321
2014-09-23 12: 08: 39Z
  1. + 1 Отлично. Причина, по которой я использую maven-dependency-plugin вместо maven-assembly-plugin, заключается в том, что я также использую buildnumber-maven-plugin, и таким образом я могу сохранить номер версии в манифесте каждого jar-файла отдельно.
    2011-09-15 10: 16: 34Z
  2. Мне нравится Ваше решение. Я использую ${project.build.directory}/classes/lib как outputDirectory, чтобы иметь один основной .jar со всеми зависимостями внутри, но - Как добавить пользовательский код загрузки классов для загрузки этих jar-файлов? Мне нужно сделать выполнение работы, например: java -jar main-jar-with-deps.jar. Возможно ли это?
    2012-03-13 19: 09: 55Z
  3. @ Андре Аронсен, я использовал это решение для добавления зависимостей в папку lib внутри фляги, но я всегда получаю исключение для класса, не найденного, посоветуйте, пожалуйста, как исправить это.
    2012-08-01 11: 36: 40Z
  4. +1 к вам !! Похоже, плагин для сборки maven 'jar-with-dependencies' не очень хорошо работает. Мне не хватало некоторых записей из META-INF /spring.schemas в сгенерированном банке. Поэтому я удалил jar-with-dependencies и использовал ваше решение выше. Прекрасное спасибо !!!
    2012-08-06 13: 35: 02Z
  5. Для всех, кто сталкивается с этой проблемой, вы должны включить папку lib в тот же каталог, в котором находится ваш jar, куда бы вы ни перемещали jar.
    2014-10-25 11: 13: 42Z

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

См. исполняемый файл Jar с Apache Maven (WordPress)

или пример исполняемого файла-jar-with-maven (GitHub ) р>

Примечания

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

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

  • Pros
  • Cons
    • Зависимости находятся вне финальной фляги.

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

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

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

  • Pros
  • Cons
    • Нет поддержки перемещения классов (используйте 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

  • Pros
  • Против
<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-плагин

  • Pros
  • Cons
    • Не активно поддерживается с 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

  • Pros
  • Cons
    • Добавьте потенциально ненужные классы, связанные с 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.

    
183
2017-05-23 12: 03: 09Z
  1. Единственное, что работает для меня, - это ручное развертывание.
    2016-09-16 02: 48: 20Z
  2. @ caiohamamura Вы можете клонировать Репозиторий GitHub и посмотрите, как работают все профили.
    2016-09-16 11: 58: 07Z
  3. Проблема была в пакете, который я использовал: stackoverflow.com/a /12622037/2548351
    2016-09-17 01: 48: 06Z
  4. Лучший ответ на вопрос несколькими способами.
    2018-11-25 15: 32: 06Z

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

<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>
    
131
2012-11-28 16: 59: 25Z
  1. Использование подхода в этом ответе приводит к следующему сообщению об ошибке: «Не удалось загрузить атрибут манифеста основного класса из < jar file > 'при попытке запустить JAR с использованием 'java -jar < jar file >'
    2010-09-10 11: 37: 57Z
  2. Необходима часть архива maven-jar-plugin < archive > &Lt; &манифест GT; &Lt; addClasspath &GT; истинно &л; /addClasspath &GT; &Lt; MainClass &GT; fully.qualified.MainClass &л; /MainClass &GT; &Л; /&манифеста GT; &Lt; /архив &GT;
    2011-11-16 14: 40: 09Z
  3. Извините, этот ответ совершенно неправильный, тег mainClass должен быть в записи maven-assembly-plugin, поскольку вы вызываете его во время цели пакета
    2012-09-01 23: 27: 40Z
  4. @ AlexLehmann true!
    2012-11-22 13: 24: 58Z
  5. Я удивлен, почему pom.xml уже не может включить это после команды mvn archetype: generate? Это раздражает, когда я вручную копирую и вставляю это каждый раз, когда я создаю новый проект maven ...
    2016-07-23 19: 32: 46Z

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

Я нашел этот плагин особенно полезным, так как он объединяет содержимое определенных файлов, а не перезаписывает их. Это необходимо, когда есть файлы ресурсов с одинаковыми именами в 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>
    
96
2012-07-10 16: 07: 14Z
  1. Итак, как bcprov-jdk15.jar попадает в путь к классам во время выполнения, если он исключен из процесса затенения?
    2010-10-12 06: 10: 22Z
  2. Он был обработан cxf-rt-ws-security, который является частью моих зависимостей
    2010-10-18 22: 58: 11Z
  3. Никогда раньше не слышал об этом плагине, но он решил мою проблему с spring.handlers внутри jar-файлов. Спасибо!
    2011-03-26 16: 02: 20Z
  4. Те, кто получил исключение безопасности, исключают DSA из Манифеста. Проверьте maven.apache.org/plugins/maven-shade -plugin /примеры /...
    2011-07-19 07: 41: 53Z
  5. + 1 В прошлом я использовал minijar: ueberjar, но плагин minijar теперь устарел и заменен на shade
    2011-12-08 12: 39: 03Z

Лонг использовал подключаемый модуль 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>
    
19
2017-05-23 11: 33: 24Z
  1. как избавиться от лишних сообщений в выводе?
    2016-04-08 12: 33: 45Z

Вы можете использовать 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>
    
17
2009-10-13 12: 16: 24Z

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

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

    
15
2009-03-11 15: 20: 35Z

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

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

    
13
2011-08-13 18: 23: 43Z

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

  • maven-shade-plugin упаковывает ваши классы и все зависимости в один файл jar.
  • Настройте maven-jar-plugin, чтобы указать основной класс исполняемого фляги (см. Настройте 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
    
11
2013-01-31 00: 24: 21Z
  1. Плагин Shade теперь имеет средства указания записи Main-Class в манифесте: maven.apache.org/plugins/maven-shade-plugin/examples/…
    2012-02-27 21: 35: 40Z

Я просмотрел каждый из этих ответов, пытаясь создать полный исполняемый файл jar, содержащий все зависимости, и ни один из них не работал правильно. Ответ - плагин 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 р>     

11
2015-11-23 22: 04: 39Z
  1. Когда я это исправлю, не могли бы вы обновить свой отзыв. Я не учел ваши мысли перед публикацией и быстро исправил их, увидев ваш комментарий
    2015-11-23 22: 10: 27Z
  2. Элемент plugin находится в pom.xml в build/plugins.
    2017-12-24 01: 54: 36Z

Вы можете использовать плагин 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>
    
11
2017-10-26 00: 57: 51Z
  1. Но тогда как это будет развернуто в репо?
    2018-05-30 08: 43: 52Z

Кен Лю, по моему мнению, прав. Плагин зависимостей 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>
    
9
2009-09-09 13: 37: 43Z
  1. Действительно приятно! Не лучше ли использовать фазу создания ресурсов для распаковки?
    2013-08-08 11: 58: 19Z

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

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

А вот и сообщение в блоге с подробностями о плагине и почему мы его сделали: https://engineering.creditkarma.com/вообще-инжиниринг /новая Исполняемая-банка-плагин доступный-апаш-Maven /

    

9
2016-10-14 16: 47: 48Z

Это должно быть так:

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

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

    
8
2018-02-04 11: 45: 40Z

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

    
7
2013-01-08 03: 05: 02Z

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

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

Никто из них не делает то, что вам нужно: ищите файл в classpath. Конечно, вам нужно добавить пакет, в котором общая сборка находится в пути к классу 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>
    
7
2013-01-31 00: 26: 37Z

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

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

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

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

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

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

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

java -jar ProjectMainJar.jar com.stackoverflow.projectName.MainDynamicClassLoaderClass
    
5
2009-12-28 16: 43: 35Z
  1. Как поместить в проект банку проекта и все зависимые банки?
    2010-11-06 18: 06: 27Z

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

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

    
4
2016-09-01 10: 21: 52Z

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

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

    
3
2010-09-14 04: 37: 43Z
  1. Я думаю, вам все равно нужно что-то делать в pom.xml, в противном случае вы получите Error reading assemblies: No assembly descriptors found.. Вот что в любом случае происходит со мной.
    2017-09-08 18: 59: 07Z

Вы также можете использовать этот плагин, он довольно хорош, и я использую его для упаковки своих банок 2

2014-01-29 13: 54: 01Z

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

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

    
2
2014-03-15 15: 47: 14Z

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

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

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

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

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

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

    
2
2014-10-10 22: 11: 18Z

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

  <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 0662505050 или J50X505035050 для J50X, а также сервер JMX 0650503503, который запускает сервер JMX и получает код JMX. параметр start. Таким образом, я смог запустить свое приложение так:

stop

Я жду, что это будет полезно для всех вас.

    
2
2015-09-30 17: 22: 48Z

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

java -jar ./lib/TestApp-1.0-SNAPSHOT.jar start
    
2
2016-02-24 18: 12: 01Z

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

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

    
2
2016-06-18 14: 50: 17Z

Уже есть миллионы ответов, я хотел бы добавить, что вам не нужно

<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>
, если вам не нужно добавлять entryPoint в ваше приложение. Например, API могут не обязательно иметь метод <mainClass>.

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

main

построить

  <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
    

2
2016-09-29 23: 27: 04Z

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

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/

и р>

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

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

    
2
2018-11-07 07: 17: 09Z

Плагин maven-assembly-plugin отлично работал для меня. Я провел часы с плагином maven-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>
, где нет включенных artifactItems, но он не работает.     
1
2013-05-24 19: 42: 04Z

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

mvn dependency:copy     
1
2015-11-25 10: 40: 27Z
<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>
источник размещен Вот