13

I am using log4j 2.3 in my java application. I added the dependency via maven.
When running the program in eclipse everything work fine, but when I package it with maven and try to run the jar I get the following error:

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

Why is it not able to find the class while running it from a jar?

Adding log4j 1.2 did not work either. The program is running fine in eclipse so there should be no missing dependency.

Pabi
  • 891
  • 3
  • 12
  • 18
  • 1
    You probably have a dependency crash, with one of your dependencies having a transitive dependency to log4j 1.x. Use `mvn dependency:tree`to find the culprit. Also, see http://stackoverflow.com/questions/26338387/unexpected-exception-java-lang-noclassdeffounderror-org-apache-log4j-logmanage – Tobb Sep 03 '15 at 06:53
  • 1
    You need to have the log4j jar in your class path. How are you executing your application? – Amila Sep 03 '15 at 06:53
  • Is there a way to do `mvn dependency:tree` in eclipse? I have not installed maven for commandline use, just using it in eclipse. I have added log4j-cire(2.3) and log4j-api(2.3) as dependencys in my pom.xml. I run it from the commandline with `java -har myApplication.jar` – Pabi Sep 03 '15 at 06:57

3 Answers3

20

When you are running your application jar from command line your dependent jar are not available at runtime. You need to include any of these two plugins to pom.xml so have your dependencies available at runtime.

Using: 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>

Using: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>

When you will execute the mvn package it will generate uber jar / or copy the dependencies to outputDirectory. I will prefer maven-shade-plugin to generate one jar will all dependencies.

Garry
  • 4,493
  • 3
  • 28
  • 48
  • I have exactly the same problem and maven-shade-plugin is not working for me. I am using maven-shaden-plugin and once it creates the jar package I execute my app with java -jar myapp.jar and I continue receiving the same error. What am I doing wrong? – Willy Feb 13 '16 at 03:17
  • using the shade-plugin do I need to change the content of the ? Or is it another scope here? – Ahmed Hasn. Feb 27 '17 at 12:34
  • @Garry " maven-shade-plugin " worked perfect. Thanks. –  Nov 29 '19 at 20:40
0

Please add jar files to class path in library, it worked for me

-1

Install the latest version of log4j (I have installed log4j-2.3.jar).

And follow the below steps:

  • Right click project -> Build path -> Libraries -> Add External Jars -> Include Log4j, Log4j core and Log4j api jars.

It worked for me

Ishaan Javali
  • 1,711
  • 3
  • 13
  • 23