Как я могу создать исполняемый JAR без зависимостей, используя Maven? - PullRequest
16 голосов
/ 30 ноября 2011

Я хочу упаковать его не в один исполняемый файл для распространения. Мне нужен исполняемый файл, похожий на main.jar, и все зависимости должны быть в libs / *. Jar

Как сделать исполняемый jar-файл maven без предварительно включенных в него библиотек зависимостей?

В Как я могу создать исполняемый JAR с зависимостями, используя Maven? есть сообщение с ответом 1 декабря '10 в 10:46 Андре Аронсен, но тот просто не работает (сбой s.a.descriptorRef не установлен).

Ответы [ 2 ]

11 голосов
/ 29 апреля 2014

Я предпочитаю это немного модифицированное решение. Создайте свой исполняемый файл jar с установленным classpath и скопируйте все зависимости в данный каталог.

Вам не нужны никакие дополнительные файлы.

Зависимости копируются на этапе установки.

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <mainClass>fully.qualified.MainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <phase>install</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        <!-- optional -->
                        <!-- exclude copying test and provided dependencies -->
                        <includeScope>runtime</includeScope>
                        <excludeScope>provided</excludeScope>
                        <!-- optional -->
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Я обновил ответ для копирования только зависимостей времени выполнения, как описано здесь - копирование правильных зависимостей . Тест и предоставленные зависимости исключены.

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

10 голосов
/ 30 ноября 2011

Вы можете достичь этого в определенной степени.

Во-первых, вы бы создали исполняемый файл jar , настроив плагин maven jar соответственно.

Затем вы использовали бы плагин сборки maven для создания jar-с-зависимостями, исключая ваш проект jar .Чтобы сделать это, вы должны создать файл дескриптора, скажем src/main/assembly/descriptor.xml, вот так.

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
  <id>jar-with-dependencies</id>
  <formats>
    <format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <outputDirectory>/</outputDirectory>
      <useProjectArtifact>false</useProjectArtifact>
      <unpack>true</unpack>
      <scope>runtime</scope>
    </dependencySet>
  </dependencySets>
</assembly>

Используйте его в своем проекте следующим образом.

<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.2.1</version>
        <configuration>
          <descriptors>
            <descriptor>src/main/assembly/descriptor.xml</descriptor>
          </descriptors>
        </configuration>
        [...]
      </plugin>
    </plugins>
  </build>
</project>

В итоге вы получитедва jar - один исполняемый jar, созданный вашим проектом, а другой jar-with-dependencies, созданный плагином сборки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...