Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ant, Tomcat Build Error: java.lang.NoClassDefFoundError: org/apache/tomcat/util/buf/B2CConverter

Tomcat Version: 7.0.20

I am attempting to work my way through the following Spring MVC tutorial: http://static.springsource.org/docs/Spring-MVC-step-by-step/part1.html

In this tutorial, an ant build script is setup to deploy to tomcat using the manager. However, I run into some problems when I try to run any of the tomcat tasks.

First off, in the tutorial, they still use org.apache.catalina.ant.InstallTask which is deprecated, so I changed to org.apache.catalina.ant.DeployTask.

Now the problem is that when trying to run the Tomcat tasks I get:

java.lang.NoClassDefFoundError: org/apache/tomcat/util/buf/B2CConverter
    at org.apache.catalina.util.Base64.encode(Base64.java:177)
    at org.apache.catalina.ant.AbstractCatalinaTask.execute(AbstractCatalinaTask.java:204)
    at org.apache.catalina.ant.AbstractCatalinaTask.execute(AbstractCatalinaTask.java:150)
    at org.apache.catalina.ant.ReloadTask.execute(ReloadTask.java:45)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:390)
    at org.apache.tools.ant.Target.performTasks(Target.java:411)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1368)
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
    at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
    at org.apache.tools.ant.Main.runBuild(Main.java:809)
    at org.apache.tools.ant.Main.startAnt(Main.java:217)
    at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
    at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)
 Caused by: java.lang.ClassNotFoundException: org.apache.tomcat.util.buf.B2CConverter
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    ... 21 more

So I Googled around a bit and found some information stating that tomcat-utils.jar should be in the class path so I added that into the fileset with the catalina-ant.jar but apparently the org.apache.tomcat.util.buf.B2CConverter class is not in there.

So next I started probing the jars with jar -tf to find out if any contained the class. I found out that tomcat-coyote.jar had the class. Even with including this in the fileset, the problem is not resolved.

Does anyone have any ideas?

like image 326
Jason Turner Avatar asked Aug 30 '11 23:08

Jason Turner


3 Answers

I got this working by changing the classpath to

<path id="catalina-ant-classpath">
    <!-- We need the Catalina jars for Tomcat -->
    <!--  * for other app servers - check the docs --> 
    <fileset dir="${appserver.lib}">
        <include name="catalina-ant.jar"/>
        <include name="tomcat-coyote.jar"/>
        <include name="tomcat-util.jar"/>
    </fileset>
    <fileset dir="${appserver.home}/bin">
                <include name="tomcat-juli.jar"/>
    </fileset>
</path>
like image 59
Aidan Skinner Avatar answered Nov 11 '22 23:11

Aidan Skinner


Like Jason, I tried Aidan's answer and it did not work. With TomCat 7 the manager interface has changed a little. Instead of using /manager/list in the URL you have to use /manager/text/list. So I changed the list task in build.xml to the following:

<target name="list" description="List Tomcat applications">
    <list url="${tomcat.manager.url}/text"
             username="${tomcat.manager.username}"
             password="${tomcat.manager.password}"/>
</target>

I also had to add the "manager-script" role to my admin user so that it would have the proper privileges for this operation:

  <role rolename="manager-gui"/>
  <role rolename="manager-script"/>
  <user username="admin" password="admin" roles="manager-gui,manager-script"/>
like image 15
wholladay Avatar answered Nov 11 '22 23:11

wholladay


I found the same error when following the same tutorial. I had to make 3 changes so that the targets run correctly.

First, change the build.xml "list" target to add the /text above mentioned:

<target name="list" description="List Tomcat applications">
    <list url="${tomcat.manager.url}/text"
          username="${tomcat.manager.username}"
          password="${tomcat.manager.password}"/>
</target>

Second, change the catalina ant classpath:

<path id="catalina-ant-classpath">
    <fileset dir="${appserver.home}/lib">
        <include name="catalina-ant.jar"/>
        <include name="tomcat-coyote.jar"/>
        <include name="tomcat-util.jar"/>
    </fileset>
    <fileset dir="${appserver.home}/bin">
        <include name="tomcat-juli.jar"/>
    </fileset>
</path>

And finally, add this to the tomcat-users.xml file:

<role rolename="manager-script"/>
  <user username="tomcat" password="s3cret" roles="manager-gui,tomcat,manager-script"/>

And then it worked for me =)

like image 12
Neets Avatar answered Nov 11 '22 22:11

Neets