2015-09-03 6 views
4

Я использую log4j 2.3 в своем приложении java. Я добавил зависимость через maven.
При запуске программы в затмение все работает нормально, но когда я упаковать его с Maven и попробуйте запустить банку, я получаю следующую ошибку:log4j2 java.lang.NoClassDefFoundError: org/apache/logging/log4j/LogManager

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, поэтому не должно быть недостающей зависимости.

+0

У вас, вероятно, есть сбой зависимости, при этом одна из ваших зависимостей имеет транзитивную зависимость от log4j 1.x. Используйте 'mvn dependency: tree', чтобы найти виновника. Кроме того, см. Http://stackoverflow.com/questions/26338387/unexpected-exception-java-lang-noclassdeffounderror-org-apache-log4j-logmanage – Tobb

+0

Вам нужно иметь банку log4j в вашем пути к классу. Как вы выполняете свое приложение? – Amila

+0

Есть ли способ сделать «mvn dependency: tree' в eclipse? Я не установил maven для использования в командной строке, просто используя его в eclipse. Я добавил log4j-cire (2.3) и log4j-api (2.3) в качестве зависимостей в моем pom.xml. Я запускаю его из командной строки с помощью 'java -har myApplication.jar' – Pabi

ответ

8

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

Использование: Maven-тень-плагин

<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-зависимость-плагин

<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 он будет генерировать убер банку/или скопировать зависимости в OutputDirectory , Я предпочел бы, чтобы maven-shade-plugin генерировал одну флягу для всех зависимостей.

+0

Большое спасибо, работал как cahrm с' maven-shade-plugin'. – Pabi

+0

@Pabi .. рад, что это вам помогло. – Garry

+0

У меня точно такая же проблема, и maven-shade-plugin не работает для меня. Я использую maven-shaden-plugin, и как только он создает пакет jar, я запускаю мое приложение с java -jar myapp.jar, и я продолжаю получать ту же ошибку. Что я делаю не так? – user1624552

Смежные вопросы