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 ответ:
При запуске приложения 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 для генерации одной банки будет все зависимости.