Maven Exec работает, но Java -JAR не работает
У меня есть простой проект Maven только с одной зависимостью. Я могу установить его и запустить из командной строки через плагин Exec Maven:
mvn exec:java -D"exec.mainClass"="com.MyClass"
После упаковки maven генерирует файл.jar в моем каталоге. С помощью Maven JAR Plugin я дал понять, что мой main
метод класса. Это выглядит как:
...
Created-By: Apache Maven 3.3.1
Build-Jdk: 1.8.0_66
Main-Class: com.MyClass
Теперь я хочу запустить этот файл.jar как обычный исполняемый файл Java, используя java
команда, но после выполнения следующего:
java -jar myFile.jar
это дает ошибку java.lang.NoClassDefFoundError
по поводу моей единственной зависимости.
Как я могу заставить maven добавить все зависимости в мой исполняемый файл jar?
2 ответа
Вы можете использовать плагин сборки Apache Maven, чтобы создать jar со всеми его зависимостями, поэтому ваш pom.xml должен выглядеть примерно так:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>mypackage.myclass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
Я надеюсь, это поможет вам, пока.
Одним из способов достижения этого является использование плагина Apache Maven Shade:
Этот плагин предоставляет возможность упаковать артефакт в uber-jar, включая его зависимости, и затемнить - т.е. переименовать - пакеты некоторых из зависимостей.
Этот плагин имеет некоторые преимущества для большого проекта с множеством зависимостей. Это объясняется здесь: Разница между maven плагинами (сборочные плагины, jar-плагины, затененные плагины)
В моем проекте я использую его с этой конфигурацией:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.2</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.xxx.tools.imagedump.ImageDumpLauncher</mainClass>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>