Frustrating Tomcat 5.5.x Issue Solved (conflicting jars...)

Posted by ryan
at 3:05 PM on Thursday, January 27, 2005



I’ve recently decided to move most of my web apps from a Tomcat 4.x platform to Tomcat 5.5.x (which also means moving to jdk 1.5). All went fine with Java-Frameworks.com (since decommissioned), but I ran into an issue when upgrading another app of mine. When I would access any page or action I would get the following stack trace:

SEVERE: Servlet.service() for servlet jsp threw exception
org.apache.jasper.JasperException: Unable to read TLD "META-INF/c-1_0.tld" from JAR file "file:/opt/java/jakarta-tomcat-5.5.4/webapps/bblmgr/WEB-INF/lib/standard-tags.jar": org.apache.jasper.JasperException: Failed to load or instantiate TagLibraryValidator class: org.apache.taglibs.standard.tlv.JstlCoreTLV
        at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:50)
        at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407)
        at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:179)
        at org.apache.jasper.compiler.TagLibraryInfoImpl.<init>(TagLibraryInfoImpl.java:181)
        at org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:418)
        at org.apache.jasper.compiler.Parser.parseDirective(Parser.java:483)
        at org.apache.jasper.compiler.Parser.parseElements(Parser.java:1539)
        at org.apache.jasper.compiler.Parser.parse(Parser.java:126)
        at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:211)
        at org.apache.jasper.compiler.ParserController.parse(ParserController.java:100)
        at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:146)
        at org.apache.jasper.compiler.Compiler.compile(Compiler.java:286)
        at org.apache.jasper.compiler.Compiler.compile(Compiler.java:267)
        at org.apache.jasper.compiler.Compiler.compile(Compiler.java:255)
        at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:556)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:296)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:245)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
        at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:129)
        at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:61)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:825)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:731)
        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:526)
        at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
        at java.lang.Thread.run(Thread.java:595)

Ok, seems like I had run into this before… oh yeah, I needed to upgrade the apache commons standard tag library to the JSTL 1.1 version located (here). Ok, downloaded that and put it in the app’s lib dir. Let’s give it another go. Nope, getting this now:

org.apache.jasper.JasperException: Unable to read TLD "META-INF/c-1_0.tld" from JAR file "file:/opt/java/jakarta-tomcat-5.5.4/webapps/bblmgr/WEB-INF/lib/standard.jar": org.apache.jasper.JasperException: Failed to load or instantiate TagLibraryValidator class: org.apache.taglibs.standard.tlv.JstlCoreTLV
  at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:50)
  at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407)
  at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:179)
  at org.apache.jasper.compiler.TagLibraryInfoImpl.<init>(TagLibraryInfoImpl.java:181)
  at org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:418)
  at org.apache.jasper.compiler.Parser.parseDirective(Parser.java:483)
  at org.apache.jasper.compiler.Parser.parseElements(Parser.java:1539)
  at org.apache.jasper.compiler.Parser.parse(Parser.java:126)
  at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:211)
  at org.apache.jasper.compiler.ParserController.parse(ParserController.java:100)
  at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:146)
  at org.apache.jasper.compiler.Compiler.compile(Compiler.java:286)
  at org.apache.jasper.compiler.Compiler.compile(Compiler.java:267)
  at org.apache.jasper.compiler.Compiler.compile(Compiler.java:255)
  at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:556)
  at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:296)
  at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
  at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:245)
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
  at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:129)
  at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:61)
  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
  at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
  at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
  at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
  at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
  at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
  at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
  at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:825)
  at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:731)
  at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:526)
  at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
  at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
  at java.lang.Thread.run(Thread.java:595)

with a root cause of …

SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.ClassCastException: org.apache.taglibs.standard.tlv.JstlCoreTLV
        at org.apache.jasper.compiler.TagLibraryInfoImpl.createValidator(TagLibraryInfoImpl.java:647)
        at org.apache.jasper.compiler.TagLibraryInfoImpl.parseTLD(TagLibraryInfoImpl.java:246)
        at org.apache.jasper.compiler.TagLibraryInfoImpl.<init>(TagLibraryInfoImpl.java:162)
        at org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:418)
        at org.apache.jasper.compiler.Parser.parseDirective(Parser.java:483)
        at org.apache.jasper.compiler.Parser.parseElements(Parser.java:1539)
        at org.apache.jasper.compiler.Parser.parse(Parser.java:126)
        at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:211)
        at org.apache.jasper.compiler.ParserController.parse(ParserController.java:100)
        at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:146)
        at org.apache.jasper.compiler.Compiler.compile(Compiler.java:286)
        at org.apache.jasper.compiler.Compiler.compile(Compiler.java:267)
        at org.apache.jasper.compiler.Compiler.compile(Compiler.java:255)
        at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:556)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:296)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:245)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
        at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:129)
        at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:61)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:825)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:731)
        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:526)
        at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
        at java.lang.Thread.run(Thread.java:595)\

After at least 2 and a half hours of trying the nightly builds of Tomcat and the standard tag libraries (when does that ever work – should have known better), I took a closer look at the last exception thrown above – ClassCastException. Don’t know why I had been mostly ignoring the significance of that exception, but it became clear to me that I probably had conflicting jsp/jstl classes on my classpath. Tomcat probably provided one set and my app another. Sure enough, I had included a “jsp-api.jar” in my application’s lib directory, and Tomcat had its own version in $CATALINA_HOME/common/lib. I removed the jar from my application and everything loaded just fine. I could have also just copied the version from Tomcat to my app, but since I didn’t need it there was no sense in keeping it around.

And so ends this particular hurdle, can’t wait to see what’s next.

In my googling for a solution to this issue there was very little out there – so I thought I’d better post it in case anybody else runs into this issue. Ascintillating it’s not, but hopefully it will be helpful.

This little tidbit may help find jars with conflicting class files – it’s how to use the Linux “find” and “xargs” command to do just that. If you’re on windows then… Cygwin?

Comments

Leave a response

  1. Philip NewtonMay 24, 2006 @ 07:27 AM
    Thanks! That helped me, too. I'm glad you posted about it :)
  2. davd@bernard.comMay 24, 2006 @ 07:27 AM
    Thanks for your post - helped me solve my problem.
  3. Ryan DaigleMay 24, 2006 @ 07:27 AM
    Sorry bout the tidbit link, Mika. It's fixed now.
  4. MikaMay 24, 2006 @ 10:16 AM
    Thank you for this share of valuable experience! The tidbit link doesn't work, but I assume it points to something like: find . -name \*.jar | while read i; do echo $i; jar tf $i | grep classname; done which works find on cygwin.
  5. FabianJune 18, 2006 @ 02:17 PM
    Thank you so much! Had exactly the same problem (the second time!)... fabian
  6. JoshJune 18, 2006 @ 02:19 PM
    Awesome, you just saved me a serious headache.
  7. Gunjan BohraJune 30, 2006 @ 07:21 AM
    Thanks For such a nice help
  8. SteveJuly 04, 2006 @ 07:43 AM
    Thanks Ryan, you saved me a lot of debugging too.
  9. hhc/cmdsAugust 26, 2006 @ 05:38 AM
    And me too :)
  10. PonnySeptember 05, 2006 @ 09:21 PM
    Awesome. Helped me out plenty.
  11. GeryOctober 04, 2006 @ 09:44 AM
    Thank you, Ryan. Your posting helped me too and saved me lots of debugging time!
  12. StevenOctober 25, 2006 @ 07:21 PM
    Thank you!
  13. MarcoApril 12, 2007 @ 12:53 PM

    Yet another big Thank-You—you saved my bacon Ryan!

    BTW, in my case it was javax.servlet.jsp.jar and javax.servlet.jar that someone on our project thought would be a nice thing to add to WEB-INF/lib… 2 days before The Big Demo!

  14. Philip MayOctober 01, 2007 @ 08:53 AM

    Thanks too! That was a great help to me.

  15. EricJanuary 15, 2008 @ 03:31 PM

    Years later and it’s still helping out… thanks!

  16. AmitJanuary 25, 2008 @ 01:38 AM

    Superb, thanks a lot. Someone had added the jsp-api.jar as dependency in our POM.xml. I removed it and voila it started working. Thanks a ton dude -Amit

  17. Ashit PatelMarch 02, 2008 @ 02:37 PM

    Ryan,

    Many thanks for articulating the underlying issue of duplicating jar files from CATALINA_HOME/common/lib.

    I am putting below a detailed description of my issue with the hope that someone else will be able to find your solution faster than I did.

    I encountered the following stack trace when trying to access a JSP page:

    java.lang.NoClassDefFoundError: org/apache/tools/ant/Main org.apache.tools.ant.Project.initProperties(Project.java:308) org.apache.tools.ant.Project.init(Project.java:295) org.apache.jasper.compiler.Compiler.getProject(Compiler.java:156) org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:330) org.apache.jasper.compiler.Compiler.compile(Compiler.java:458) org.apache.jasper.compiler.Compiler.compile(Compiler.java:439) org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:553) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:291) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:301) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:248) javax.servlet.http.HttpServlet.service(HttpServlet.java:856)

    Searching for ‘java.lang.NoClassDefFoundError: org/apache/tools/ant/Main’ yielded info about how to setup ant correctly but nothing about Tomcat.

    Searching for ‘org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:553)’ got me to your blog. Looking carefully at my classpath, I realized that ant.jar and a bunch of other jar files that are in common/lib were duplicated in my CLASSPATH. Everything works once I fixed.

    Ashit

  18. ShaunakMarch 21, 2008 @ 02:11 AM

    Thanks Ryan.. u saved lots of my time…..

  19. rportilloApril 23, 2008 @ 01:12 PM

    And 3 years later your advice is still a gem!!! Thanks!