maven install create jar, которые ничего не делают при двойном щелчке [duplicate]

Я наткнулся на ту же проблему. Программа отлично работала от Eclipse с помощью кнопки «Запустить», но не из запускаемого JAR, который я ранее экспортировал. Мое решение было:

1) Переместить основной класс в пакет по умолчанию

2) Установить другой путь для Eclipse и другие во время работы из файла JAR (вставить это в Main.java)

public static final String sourcePath = isProgramRunnedFromJar() ? "src/" : "";
public static boolean isProgramRunnedFromJar() {
    File x = getCurrentJarFileLocation();
    if(x.getAbsolutePath().contains("target"+File.separator+"classes")){
        return false;
    } else {
        return true;
    }
}
public static File getCurrentJarFileLocation() {
        try {
            return new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
        } catch(URISyntaxException e){
            e.printStackTrace();
            return null;
        }
}

И после этого в методе начала вам необходимо загрузить такие файлы:

FXMLLoader loader = new FXMLLoader(getClass().getResource(sourcePath +"MainScene.fxml"));

Это работает для меня на Eclipse Mars с e (fx) клише. / g4]

1968
задан Rann Lifshitz 31 May 2018 в 01:59
поделиться

31 ответ

<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>
1875
ответ дан 7 revs, 7 users 36% 15 August 2018 в 20:43
поделиться
  • 1
    Спасибо @IAdapter. Обратите внимание, что вы всегда должны делать компиляцию перед рукой, потому что она просто помещает все, что находится в & quot; target / classes & quot; в банке. Это гарантирует, что JAR включает любые изменения, которые вы недавно внесли в исходный код. Итак, вы должны сделать что-то вроде: mvn clean compile assembly:single. – Michael 31 May 2011 в 20:03
  • 2
    Я отредактировал вопрос, чтобы включить привязку к фазе. Я удалил цель устаревших сборок, потому что никто не должен об этом знать. – Duncan Jones 21 February 2013 в 10:38
  • 3
    Я вижу, что это не добавляет банки в uber jar, вместо этого это просто добавляет все файлы классов в банку. – pitchblack408 7 April 2015 в 16:31
  • 4
    Совет. Вы также можете добавить элемент <appendAssemblyId>false</appendAssemblyId> в configuration, чтобы избежать раздражающих «-jar-with-dependencies». суффикс в названии – maxivis 6 May 2015 в 19:22
  • 5
    забудьте compile, и вы ввернуты. – prayagupd 13 November 2016 в 01:44

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

2
ответ дан Adelin 15 August 2018 в 20:43
поделиться

Чтобы решить эту проблему, мы будем использовать 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

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

2
ответ дан Anoop Rai 15 August 2018 в 20:43
поделиться

Добавить в 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>

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

1
ответ дан Aydin K. 15 August 2018 в 20:43
поделиться

Вы можете добавить следующее в свой 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 и запустить свою банку с помощью команды, аналогичной java -jar mavenproject1-1.0-SNAPSHOT-jar-with-dependencies.jar.

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

11
ответ дан Benny Neugebauer 15 August 2018 в 20:43
поделиться

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

1
ответ дан Chris 15 August 2018 в 20:43
поделиться

Длинный использовал плагин сборки maven, но я не мог найти решение проблемы с "already added, skipping" . Теперь я использую другой плагин - onejar-maven-plugin . Пример ниже (mvn package build 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>
135
ответ дан Community 15 August 2018 в 20:43
поделиться

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

    <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

8
ответ дан dsutherland 15 August 2018 в 20:43
поделиться
  • 1
    Поскольку я исправил это, не могли бы вы обновить свой обзор. Я не принимал во внимание ваши мысли до публикации и быстро исправился, увидев ваш комментарий – dsutherland 23 November 2015 в 23:10
  • 2
    Элемент plugin находится в pom.xml в build/plugins. – isapir 24 December 2017 в 02:54

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

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

295
ответ дан Duncan Jones 15 August 2018 в 20:43
поделиться
  • 1
    +1 Отлично. Причина, по которой я собираюсь использовать плагин maven-dependency вместо maven-assembly-plugin, заключается в том, что я также использую buildnumber-maven-plugin, и таким образом я могу хранить номер версии в манифесте каждой банки отдельно. – PapaFreud 15 September 2011 в 11:16
  • 2
    Мне нравится ваше решение. Я использую ${project.build.directory}/classes/lib как outputDirectory, чтобы иметь один основной .jar со всеми зависимостями внутри, но - как добавить пользовательский код загрузки классов для загрузки этих банок? Мне нужно выполнить выполнение работы, например: java -jar main-jar-with-deps.jar. Это возможно ? – marioosh 13 March 2012 в 21:09
  • 3
    @ André Aronsen, я использовал это решение для добавления зависимостей в папке lib внутри jar, но я всегда получаю исключение класса, которое не найдено, можете ли вы посоветовать, как это исправить. – Mahmoud Saleh 1 August 2012 в 12:36
  • 4
    +1 к вам !! Похоже, что сборщик maven сборщика «jar-with-dependencies» на самом деле не работает. Мне не хватало некоторых записей из META-INF / spring.schemas в сгенерированной банке. Поэтому я отказался от jar-with-dependencies и использовал ваше решение выше. Отличное спасибо !!! – Derek 6 August 2012 в 14:35
  • 5
    Для всех, кто сталкивается с этой проблемой, вы должны включить папку lib в тот же каталог с вашей банкой, где бы вы ни переносили банку. – Sparticles 25 October 2014 в 12:13

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

  <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

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

2
ответ дан EliuX 15 August 2018 в 20:43
поделиться

Я сравнил плагины деревьев, упомянутые в этом посте. Я создал 2 баночки и каталог со всеми банками. Я сравнил результаты и, безусловно, лучший плагин maven-shade. Моя задача заключалась в том, что у меня есть несколько ресурсов, которые нужно объединить, а также jax-rs и JDBC-сервисы. Они были полностью объединены плагином с оттенком по сравнению с плагином maven-assembly-plugin. В этом случае пружина будет терпеть неудачу, если вы не скопируете их в папку собственных ресурсов и не объедините их вручную один раз. Оба плагина выводят правильное дерево зависимостей. У меня было несколько областей, таких как тестирование, предоставление, компиляция и т. Д. Тест и предоставленные были пропущены обоими плагинами. Они оба выпустили один и тот же манифест, но я смог консолидировать лицензии с помощью плагина с использованием своего трансформатора. Разумеется, с плагином maven-dependency у вас нет этих проблем, потому что банки не извлекаются. Но, как и некоторые другие, вы указали, что вам нужно иметь один дополнительный файл (ы) для правильной работы. Ниже приведен фрагмент 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>
1
ответ дан Fabio 15 August 2018 в 20:43
поделиться

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

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

2
ответ дан hd1 15 August 2018 в 20:43
поделиться

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

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

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

0
ответ дан Jan Ziegler 15 August 2018 в 20:43
поделиться

Вот исполняемый плагин 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-имеющиеся в наличии апаша-Maven /

6
ответ дан jchavannes 15 August 2018 в 20:43
поделиться

Используйте плагин maven-shade для упаковки всех зависимостей в одну uber-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>
91
ответ дан Kristian Glass 15 August 2018 в 20:43
поделиться
  • 1
    Итак, как bcprov-jdk15.jar попадает в путь класса во время выполнения, учитывая, что он исключен из процесса затенения? – Andrew Swan 12 October 2010 в 07:10
  • 2
    Это было вызвано cxf-rt-ws-security, которое является частью моих зависимостей – Vijay Katam 18 October 2010 в 23:58
  • 3
    Никогда не слышал об этом плагине раньше, но он решил мою проблему с spring.handlers внутри банки. Благодаря! – Alexandre L Telles 26 March 2011 в 17:02
  • 4
    Те, кто получил исключение безопасности, исключают суточные из манифеста. Проверьте maven.apache.org/plugins/maven-shade-plugin/examples/… – ruhsuzbaykus 19 July 2011 в 08:41
  • 5
    +1 Я использовал minijar: ueberjar в прошлом, но плагин minijar теперь устарел и заменен оттенком – rds 8 December 2011 в 14:39

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

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

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

5
ответ дан Masoud Mokhtari 15 August 2018 в 20:43
поделиться

Кен Лю прав, на мой взгляд. Плагин зависимостей maven позволяет вам расширять все зависимости, которые затем можно рассматривать как ресурсы. Это позволяет включить их в артефакт main . Использование плагина сборки создает вторичный артефакт, который может быть трудно модифицировать - в моем случае я хотел добавить пользовательские записи манифеста. Мой 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>
7
ответ дан Matthew Franglen 15 August 2018 в 20:43
поделиться
  • 1
    Действительно мило! Не было бы лучше использовать фазу генерации ресурсов для распаковки? – nawroth 8 August 2013 в 12:58

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

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

13
ответ дан Matthew McCullough 15 August 2018 в 20:43
поделиться

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

mvn assembly: assembly

2
ответ дан Mayank 15 August 2018 в 20:43
поделиться
  • 1
    Я думаю, вам все равно нужно сделать некоторые вещи в pom.xml, иначе вы получите Error reading assemblies: No assembly descriptors found.. Это все равно для меня. – Sridhar-Sarnobat 8 September 2017 в 18:59

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

<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 и привяжите его к событию lifecycle package. Однако получить то, что вам нужно называть цель assembly:single, если вы помещаете это в свой pom.xml, в то время как вы вызываете «сборка: сборка», если вы выполняете его вручную из командной строки.

<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>
122
ответ дан Mike Rylander 15 August 2018 в 20:43
поделиться
  • 1
    Использование подхода в этом ответе приводит к следующему сообщению об ошибке: «Не удалось загрузить атрибут манифеста Main-Class из файла & lt; jar & gt;» при попытке запустить JAR с использованием «java -jar & lt; jar file & gt;»; – Elmo 10 September 2010 в 12:37
  • 2
    Необходима архивная часть maven-jar-plugin & lt; archive & gt; & Lt; & манифест GT; & Lt; addClasspath & GT; истинно & л; / addClasspath & GT; & Lt; MainClass & GT; fully.qualified.MainClass & л; / MainClass & GT; & Л; / & манифеста GT; & Lt; / архив & GT; – RockyMM 16 November 2011 в 16:40
  • 3
    Извините, этот ответ не прав, тег mainClass должен находиться в записи maven-assembly-plugin, поскольку вы вызываете это во время цели пакета – Alex Lehmann 2 September 2012 в 00:27
  • 4
    @AlexLehmann правда! – RockyMM 22 November 2012 в 15:24
  • 5
    Я удивлен, почему не может pom.xml уже включить это после mvn archetype: generate command? Это досадно вручную копировать-вставлять это каждый раз, когда я создаю новый проект maven ... – wintermute 23 July 2016 в 19:32

Вы можете использовать плагин 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>
4
ответ дан Minisha 15 August 2018 в 20:43
поделиться
  • 1
    Но тогда как это будет развернуто для репо? – Francesco Gualazzi 30 May 2018 в 08:43

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

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

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

См. this для получения дополнительной информации.

Класс: 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>
8
ответ дан n00begon 15 August 2018 в 20:43
поделиться

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

maven plugin config

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

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/
1
ответ дан prayagupd 15 August 2018 в 20:43
поделиться

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

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

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

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

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

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

2
ответ дан Rocky Inde 15 August 2018 в 20:43
поделиться

Это также может быть вариант, вы сможете создать свой файл 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>
1
ответ дан salmanbw 15 August 2018 в 20:43
поделиться

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

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

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

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

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

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

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

java -jar ProjectMainJar.jar com.stackoverflow.projectName.MainDynamicClassLoaderClass
4
ответ дан SRG 15 August 2018 в 20:43
поделиться
  • 1
    Как разместить банку проекта и все зависимые банки в архив? – Hai Minh Nguyen 6 November 2010 в 19:06

Вы можете использовать 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>
14
ответ дан user 15 August 2018 в 20:43
поделиться

Я писал о различных способах этого.

См. Исполняемый ящик с Apache Maven (WordPress)

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

Примечания

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


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

  • Плюсы
  • Минуты Зависимости выходят из финальной банки.

Зависимости копирования к определенному каталогу

<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 Executable и 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 доступен только в каталоге sibling ...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-plugin

  • Плюсы
  • Минуты Не активно поддерживается с 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

  • Плюсы
  • Минусы Добавьте потенциальные ненужные классы 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.

135
ответ дан Community 15 August 2018 в 20:43
поделиться

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

8
ответ дан n00begon 15 August 2018 в 20:43
поделиться
9
ответ дан n00begon 5 September 2018 в 20:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: