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

вы заполняете копию (которую вы тогда не видите)

либо:

вот более подробное объяснение Pandas: Chained Назначения

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

7 ответов

<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

, гол Компиляции должен быть забит, прежде 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>
2189
ответ дан 7 revs, 7 users 36% 31 May 2018 в 11: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 и свяжите его с 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>
134
ответ дан Mike Rylander 31 May 2018 в 11:59
поделиться

Другая опция, если Вы действительно хотите повторно упаковать другое содержание БАНОК в своем единственном результирующем JAR, плагин блока Знатока . Это распаковывает и затем переупаковывает все в каталог через <unpack>true</unpack>. Тогда у Вас была бы вторая передача, которая встроила его в один крупный JAR.

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

15
ответ дан Matthew McCullough 31 May 2018 в 11:59
поделиться

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

<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
ответ дан 22 November 2019 в 19:55
поделиться

Вы можете использовать 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
ответ дан 22 November 2019 в 19:55
поделиться

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

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

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

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

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

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

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

java -jar ProjectMainJar.jar com.stackoverflow.projectName.MainDynamicClassLoaderClass
5
ответ дан 22 November 2019 в 19:55
поделиться

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

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

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

9
ответ дан 22 November 2019 в 19:55
поделиться
Другие вопросы по тегам:

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