Создание жирной банки с помощью maven


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

Я слышал, что это можно сделать с помощью maven-assembly-plug-in, но я не понимаю как. Может кто-нибудь указать мне на некоторые примеры.

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

6 87

6 ответов:

добавить следующий плагин для pom.xml Последнюю версию можно найти по адресу https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-assembly-plugin

      ... 
      <build>
      <plugins>
      <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>CHOOSE LATEST VERSION HERE</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>

            </configuration>
            <executions>
                <execution>
                    <id>assemble-all</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        </plugins>
        </build>

после настройки этого плагина, под управлением mvn package произведет две банки: одну, содержащую только классы проекта, и вторую жирную банку со всеми зависимостями с суффиксом "-jar-with-dependencies".

если вы хотите правильно classpath настройки во время выполнения, а затем также добавить следующие плагин

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

можно использовать Maven-shade-plugin.

после настройки плагина shade в вашей сборке команда mvn package создаст одну единственную банку со всеми зависимостями, объединенными в нее.

может быть, вы хотите maven-shade-plugin, связывать зависимости, минимизировать неиспользуемый код и скрывать внешние зависимости, чтобы избежать конфликтов.

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.1.1</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <minimizeJar>true</minimizeJar>
                        <createDependencyReducedPom>true</createDependencyReducedPom>
                        <dependencyReducedPomLocation>
                            ${java.io.tmpdir}/dependency-reduced-pom.xml
                        </dependencyReducedPomLocation>
                        <relocations>
                            <relocation>
                                <pattern>com.acme.coyote</pattern>
                                <shadedPattern>hidden.coyote</shadedPattern>
                            </relocation>
                        </relocations>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

ссылки:

на самом деле, добавив элемент

<archive>
   <manifest>
    <addClasspath>true</addClasspath>
    <packageName>com.some.pkg</packageName>                     
    <mainClass>com.MainClass</mainClass>
  </manifest>
</archive>

объявление в Maven-jar-plugin не добавляет основную запись класса в файл манифеста для меня. Мне пришлось добавить его в плагин Maven-assembly, чтобы получить это в манифесте

можно использовать onejar-maven-plugin для упаковки. В принципе, он собирает ваш проект и его зависимости в виде одной банки, включая не только ваш файл jar проекта, но и все внешние зависимости в виде "банки банок", например

<build>
    <plugins>
        <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>
    </plugins>
</build>

Примечание 1: параметры конфигурации доступны в проекте Домашняя страница.

примечание 2: по той или иной причине проект onejar-maven-plugin не публикуется в Maven Central. Однако jolira.com отслеживает исходный проект и публикует его с помощью groupId com.jolira.

в качестве альтернативы можно использовать команду Maven тени плагин для создания uber-jar.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version> Your Version Here </version>
    <configuration>
            <!-- put your configurations here -->
    </configuration>
    <executions>
            <execution>
                    <phase>package</phase>
                    <goals>
                            <goal>shade</goal>
                    </goals>
            </execution>
    </executions>
</plugin>