Skip to content
Advertisement

java.lang.ClassNotFoundException with log4j

I am trying my first project with gradle. My project has a dependency with log4j-1.2.17.jar After my project is built, a jar file is generated. I try to run this with the following:

java -classpath ".:/home/ec2-user/dlsvr/lib/log4j-1.2.17.jar" -jar dlsvr.jar

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Logger
        at com.secutrans.dlsvr.DLSvrMain.<clinit>(DLSvrMain.java:27)
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Logger
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 1 more

But if I build a fatjar with gradle, the fatjar works without specifying any classpath. The dependency statement in gradle is like:

dependencies 
{
    compile files("/home/ec2-user/dlsvr/lib/log4j-1.2.17.jar")
}

Advertisement

Answer

Yes, AbtPst is correct. It is a classpath problem.

Here is similar question. Does java -jar option alter classpath options

An executable JAR must reference all the other dependent JARs it requires through the Class-Path header of the manifest file. The environment variable CLASSPATH and any class path specified on the command line is ignored by the JVM if the -jar option is used.

My problem was resolved by adding classpath in manifest file of the jar through gradle.

jar {
  manifest {
    attributes(
      "Class-Path": configurations.compile.collect { it.getName() }.join(' '))
  }
}  
User contributions licensed under: CC BY-SA
2 People found this is helpful
Advertisement