Wednesday, February 8, 2012

java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory or "Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory"exception comes when you don't apache commons-logging-1.1.1.jar in your Classpath. I have faced this exception many times while using opensource framework like Struts, Spring and Displaytag which uses commons-logging framework for logging. commons-loggingis not an actual java logging framework but provides a wrapper so that you can use log4j, java logging or anyother Java logging framework. commons-logging is also smart enough to detect which logging framework are you using e.gif you are using log4j it can detect it by looking log4j.jar in your classpath. but if you don't have commons-logging.jarin your classpath you may get java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory at runtime evenif your application gets deployed successfully.

Real cause of "Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory" or "java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory"is JVM not able to locate commons-logging-1.1.1.jar in classpath but it may surface differently on different environment. Some time even you get this error even if you already have commons-logging-1.1.1.jar in classpath and many times it different reasons fordifferent environment. It gets more difficult on managed environment like J2EE web servers and application servers wheredifferent classloader loads different classes e.g. AppClassLoader is responsible for loading web application butclasses inside lib directory of web server e.g. tomcat is loaded by another classloader. So you can also get"java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory" if commons-logging.jar is not visible toApp classloader. some times this jar can also cause memory leak in tomcat.

here I have outlined some steps to fix "java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory"these are based on approach I used to resolve such kind of error. it may help you as well.

1.Check your classpath for commons-logging-1.1.1.jar, if you are using spring MVC and working in web application it

must be on /WEB-INF/lib directory.

2.Check if your Java program has sufficient permission to access that jar file (I faced this issue in Unix machine

when user who copied that jar does override the default permission and application was not able to read this jar file

so make sure to check permissions if you are copying commons-logging-1.1.1.jar into Java Classpath.

3.See if commons-logging-1.1.1.jar contains org.apache.commons.logging.LogFactory class or not this may happen ifcommons-logging-1.1.1.jar is corrupt or not downloaded completely or may be downloaded from incorrect source.

4.See if your Classpath is getting overridden by any start-up Script as suggested on my post how to solve java.lang.ClassNotFoundException

5.If you are using maven for managing dependency on your project than check if your pom.xml file contains following

entry or not and if it doesn't than include following dependency for commons-logging-1.1.1.jar in pom.xml:

Maven dependency for Apache commons-logging:

<dependency>

<groupId>commons-logging</groupId>

<artifactId>commons-logging</artifactId>

<version>1.1.1</version>

</dependency>

That's all on How to fix java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory Error, it may surfaceas "Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory" also but mostlycause of both errors are same. If you have any other useful step to figure out ClassNotFoundException suggest it here.

3 comments
:

Amit Bhargava
said...

Not quite a question on this article, but here goes.

I've got a common.jar file that I build using maven and store in my local repository so that i can build other modules. Is there any way I can delete previous versions of the jar while storing it in repository?