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>
Другие вопросы по тегам