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

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

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

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

Ответ 1

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

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

Для весенней загрузки приложения используйте только следующий плагин (выберите соответствующую версию)

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <fork>true</fork>
        <mainClass>${start-class}</mainClass>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Ответ 2

Вы можете использовать maven-shade-plugin.

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

Ответ 3

Может быть, вам нужен 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>

Рекомендации:

Ответ 4

добавив

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

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

Ответ 5

Вы можете использовать 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.

Ответ 6

Альтернативой является использование плагина maven shade для создания 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>