log4j2 java.яз..NoClassDefFoundError: org / apache / logging/log4j/LogManager


Я использую log4j 2.3 в своем java-приложении. Я добавил зависимость через maven.
При запуске программы в eclipse все работает нормально, но когда я упаковываю ее с maven и пытаюсь запустить jar, я получаю следующую ошибку:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache logging/log4j/LogManager
    at main.myclass.<clinit>(myclass.java:11)
Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.LogManager 


    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 1 more

Почему он не может найти класс, запустив его из банки?

Добавление log4j 1.2 также не сработало. Программа отлично работает в eclipse, так что не должно быть никаких отсутствующих зависимостей.

1 5

1 ответ:

При запуске приложения jar из командной строки зависимые jar недоступны во время выполнения. Вам нужно включить любой из этих двух плагинов в pom.xml так что ваши зависимости доступны во время выполнения.

Использование: maven-shade-plugin

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.4.1</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <mainClass>org.sonatype.haven.HavenCli</mainClass>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>

Использование: maven-dependency-plugin

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.8</version>
    <executions>
        <execution>
             <id>copy-dependencies</id>
             <phase>package</phase>
             <goals>
                 <goal>copy-dependencies</goal>
             </goals>
             <configuration>
                 <outputDirectory>${project.build.directory}/lib</outputDirectory>
             </configuration>
        </execution>
     </executions>
</plugin>

Когда вы выполните mvn package, он сгенерирует uber jar / или скопирует зависимости в outputDirectory. Я предпочту maven-shade-plugin для генерации одной банки будет все зависимости.