Как создать исполняемый файл JAR со всеми зависимостями maven? - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть проект maven, и я хотел бы создать файл jar со всеми зависимостями. Я использую плагин оттенка пакета и команду mvn package для создания файла jar.

Однако созданный файл JAR не учитывает какие-либо зависимости, которые есть в pom. xml. Полученный файл jar keep дает мне исключение:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Level

Вот содержание pom. xml:

<dependencies>
    <dependency>
        <groupId>${project.groupId}</groupId>
        <artifactId>myProject-core</artifactId>
        <version>${project.version}</version>
    </dependency>
    <dependency>
        <groupId>${project.groupId}</groupId>
        <artifactId>myProject-parser</artifactId>
        <version>${project.version}</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>${slf4j.version}</version>
    </dependency>
    <dependency>
        <groupId>info.picocli</groupId>
        <artifactId>picocli</artifactId>
        <version>${picoli.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>${shade.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/log4j/log4j -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.16</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.13.1</version>
     </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.13.1</version>
     </dependency>
</dependencies>
<profiles>
    <profile>
        <id>client</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-shade-plugin</artifactId>
                    <version>${shade.version}</version>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>shade</goal>
                            </goals>
                            <configuration>
                                <finalName>myProject-client-${project.version}</finalName>
                                <transformers>
                                    <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                        <mainClass>myProject.package.main</mainClass>
                                    </transformer>
                                    <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
                                </transformers>
                                <filters>
                                    <!-- This is necessary to avoid a java.lang.SecurityException -->
                                    <filter>
                                        <artifact>*:*</artifact>
                                        <excludes>
                                            <exclude>META-INF/*.SF</exclude>
                                            <exclude>META-INF/*.DSA</exclude>
                                            <exclude>META-INF/*.RSA</exclude>
                                        </excludes>
                                    </filter>
                                </filters>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-jar-plugin</artifactId>
                    <configuration>
                         <archive>
                            <manifest>
                                <!-- Jar file entry point -->
                                <mainClass>myProject.package.main</mainClass>
                            </manifest>
                         </archive>
                    </configuration>
                </plugin>

            </plugins>
        </build>

Где моя ошибка? Это даже не учитывает <mainClass>myProject.package.main</mainClass> для основного класса, когда я запускаю флягу, я должен указать имя класса:

java -cp myApp.jar myProject.package.main 

Я просмотрел большинство вопросов, и ничего не решило мою проблему.

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Прежде всего, есть два плагина, которые вы можете использовать для создания толстых банок: maven-shade-plugin и maven-assembly-plugin .

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

Если вы не ожидаете, что этот артефакт будет использоваться как зависимость от других проектов, вы можете использовать для него maven-assembly-plugin. Вот пример того, как его использовать:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.1.1</version>
            <configuration>
                <finalName>${project.artifactId}</finalName>
                <archive>
                    <manifest>
                        <mainClass>myProject.package.main</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <appendAssemblyId>false</appendAssemblyId>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

Если вам действительно нужно затенить свои зависимости, попробуйте изменить конфигурацию манифеста плагина следующим образом, по крайней мере, это должно решить проблему, которую вы ... Имеется с указанием основного класса:

            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
              <manifestEntries>
                <Main-Class>myProject.package.main</Main-Class>
                <X-Compile-Source-JDK>${maven.compiler.source}</X-Compile-Source-JDK>
                <X-Compile-Target-JDK>${maven.compiler.target}</X-Compile-Target-JDK>
              </manifestEntries>
            </transformer>
0 голосов
/ 07 апреля 2020

В зависимостях с org нет groupId. apache .log4j, у вас есть: org. apache .logging.log4j, но это не то же самое, что: org. apache .log4j

...