【问题标题】:Ant, Tomcat Build Error: java.lang.NoClassDefFoundError: org/apache/tomcat/util/buf/B2CConverterAnt,Tomcat 构建错误:java.lang.NoClassDefFoundError:org/apache/tomcat/util/buf/B2CConverter
【发布时间】:2011-11-07 05:50:08
【问题描述】:

Tomcat 版本:7.0.20

我正在尝试完成以下 Spring MVC 教程: http://static.springsource.org/docs/Spring-MVC-step-by-step/part1.html

在本教程中,ant 构建脚本被设置为使用管理器部署到 tomcat。但是,当我尝试运行任何 tomcat 任务时,我遇到了一些问题。

首先,在教程中,他们仍然使用已弃用的org.apache.catalina.ant.InstallTask,所以我改为org.apache.catalina.ant.DeployTask

现在的问题是,当我尝试运行 Tomcat 任务时:

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

所以我用 Google 搜索了一下,发现一些信息表明 tomcat-utils.jar 应该在类路径中,所以我将它添加到带有 catalina-ant.jar 的文件集中,但显然 org.apache.tomcat.util.buf.B2CConverter 类不在其中。

所以接下来我开始用jar -tf 探测这些罐子,看看是否有任何包含该类的罐子。我发现tomcat-coyote.jar 上课了。即使将其包含在文件集中,问题也没有解决。

有人有什么想法吗?

【问题讨论】:

标签: java tomcat ant spring-mvc


【解决方案1】:

我通过将类路径更改为

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

【讨论】:

  • 我在这里发现了一个类似的案例:coderanch.com/t/551052/Spring/… 但是解决方案与此处提供的相同,对我不起作用。如果这意味着什么,我在 Mac OS X 上。
  • 我在完成这项工作时也遇到了问题,最后缺少的步骤是:从 $ANT_HOME/lib 中删除 catalina-ant.jar,如果您在之前的试错会话期间将它复制到那里。
【解决方案2】:

这似乎对我有用(Tomcat 7.0.21,OS X):

<path id="catalina-ant-classpath">
  <fileset dir="${tomcat_dir}/lib">
    <include name="catalina-ant.jar"/>
    <include name="tomcat-coyote.jar"/>
    <include name="tomcat-util.jar"/>
  </fileset>
  <fileset dir="${tomcat_dir}/bin">
    <include name="tomcat-juli.jar"/>
  </fileset>
</path>
<taskdef name="deploy" classname="org.apache.catalina.ant.DeployTask" classpathref="catalina-ant-classpath"/>
<taskdef name="undeploy" classname="org.apache.catalina.ant.UndeployTask" classpathref="catalina-ant-classpath"/>
<taskdef name="list" classname="org.apache.catalina.ant.ListTask" classpathref="catalina-ant-classpath"/>

【讨论】:

  • 感谢您的回答。基本上和艾丹的一样。反正我试过了,结果一样。
【解决方案3】:

像 Jason 一样,我尝试了 Aidan 的答案,但没有奏效。在 TomCat 7 中,管理器界面发生了一些变化。您必须使用 /manager/text/list,而不是在 URL 中使用 /manager/list。于是我把build.xml中的list任务改成如下:

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

我还必须为我的管理员用户添加“manager-script”角色,以便它拥有执行此操作的适当权限:

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

【讨论】:

  • 这是对 Tomcat 7 设置的好建议,但我认为它与解决此问题的方法无关。感谢您的意见。
  • 我也在努力让这个 Spring MVC 教程工作,这个技巧确实让构建任务与上面的 aidan 配置一起为我工作。但是,我建议通过编辑 build.properties 文件并将 tomcat.manager.url 设置为包含 /text 来修复所有 ant 任务的 tomcat 管理器 url。
  • 别忘了重启tomcat服务器!
【解决方案4】:

我不确定为什么会发生这种情况,但这里有一个解决方法: http://www.coderanch.com/t/553582/Tomcat/java-lang-NoClassDefFoundError-org-apache

我正在寻找解决方案,一旦我得到它,我会尽量不要忘记在这里发布它。

我使用opensuse。

【讨论】:

    【解决方案5】:

    我在 Mac OS X 上。这对我有用:

    <!-- ============================================================== -->
    <!-- Tomcat tasks - remove these if you don't have Tomcat installed -->
    <!-- ============================================================== -->
    
        <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>
    

    【讨论】:

      【解决方案6】:

      其他答案都不适合我。相反,我将 TOMCAT_HOME/lib/catalina-ant.jar、TOMCAT_HOME/lib/tomcat-coyote.jar、TOMCAT_HOME/lib/tomcat-util.jar 和 TOMCAT_HOME/bin/tomcat-juli.jar 复制到了 ANT_HOME/lib 目录。

      似乎 classpathref 没有正确包含这些文件。

      【讨论】:

      • 您可能在 ANT_HOME/lib 中有 catalina-ant.jar。尝试从该位置删除它,然后尝试使用先前答案之一中设置的类路径再次部署...
      【解决方案7】:

      我在学习相同的教程时发现了同样的错误。 我必须进行 3 处更改才能使目标正确运行。

      首先,更改build.xml“列表”目标以添加上面提到的/text:

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

      二、修改catalina ant类路径:

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

      最后,将其添加到 tomcat-users.xml 文件中:

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

      然后它对我有用 =)

      【讨论】:

      • 刚刚用 7.0.33 测试过,三个步骤都加了就可以了。
      • @Jason Turner 这是正确的答案我也在运行 Mac OS 并按照 Neets 的建议解决了这个问题。确保您更改的是 Catalina 类路径而不是主类路径
      【解决方案8】:

      我是 Spring 新手,甚至是第一次使用 tomcat,我只是尝试将类路径添加到 build.xml 中的小节 tomcat 任务(在每个 tomcat 任务中),我不知道为什么,但它可以工作。

      <taskdef name="deploy" classname="org.apache.catalina.ant.DeployTask">
          <classpath>
              <path location="${appserver.home}/lib/catalina-ant.jar"/>
              <path location="${appserver.home}/lib/tomcat-coyote.jar"/>
              <path location="${appserver.home}/lib/tomcat-util.jar"/>
              <path location="${appserver.home}/bin/tomcat-juli.jar"/>
          </classpath>
      </taskdef>
      

      【讨论】:

        【解决方案9】:

        为了让所有 ant 命令正常工作,可以在 build.properties 文件中更改管理器 url,而不是在 build.xml 文件中定义“list”目标时更改 url。

        tomcat.manager.url=http://localhost:8080/manager/text
        

        【讨论】:

          【解决方案10】:

          在进行上述更改并运行“蚂蚁列表”后,我得到了错误, java.io.FileNotFoundException: ..../manager/text/list"。 它是通过从其安装目录启动 tomcat 而不是使用 eclipse 启动它来解决的。 启动tomcat后,首先在浏览器中尝试“localhost:8080”。这应该显示 tomcats 页面。然后尝试运行“蚂蚁列表”。它有效,上述问题已解决。

          【讨论】:

            【解决方案11】:

            我建议对之前的答案稍作修改。

            在 Tomcat 7 文档1 中强烈建议不要将用户配置为同时拥有 manager-gui 和 manager-script 角色。它会使您的网站容易受到 CSRF 攻击。

            为每个角色定义具有不同密码的单独用户会更安全:

            <role rolename="manager-"/>
            <role rolename="manager-script"/>
            <user username="admin-gui" password="s3cret1" roles="manager-gui"/>
            <user username="admin-script" password="s3cret2" roles="manager-script"/>
            

            一般情况下,您只需要记住GUI用户的用户名和密码,因此更安全的配置是没有负担的。

            【讨论】:

              【解决方案12】:

              三件事-

              • 如果使用 Tomcat 7.x 更改 catalina-ant-classpath 的文件集

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

              • 在 tomcat-users.xml 中更改用户以授予用户作为 manager-script 的权限

              • 将 tomcat.manager.url 属性更改为 http://localhost:8080/manager/text

              【讨论】:

                【解决方案13】:

                三件事-

                如果使用 Tomcat 7.x 更改 catalina-ant-classpath 的文件集

                    <path id="catalina-ant-classpath">
                    <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> 
                

                在 tomcat-users.xml 中更改用户以授予用户作为 manager-script 的权限

                将 tomcat.manager.url 属性更改为 http://localhost:8080/manager/text

                【讨论】:

                  【解决方案14】:

                  对我有用的是将四个 jar 文件添加到构建路径

                  运行->运行配置->选择你的程序,选择右边的Classpath选项卡,点击User Entries,然后从tomcat目录添加外部4个jar

                  在此之后,我的 build.xml 像以前一样运行

                  【讨论】:

                    【解决方案15】:

                    你只需要将catalina-ant.jartomcat-coyote.jartomcat-util.jartomcat_home/lib/目录添加到ant_home/lib/目录

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2018-08-27
                      • 2016-07-06
                      • 2010-11-12
                      • 2018-10-22
                      • 1970-01-01
                      相关资源
                      最近更新 更多