找不到类定义错误:org/apache/tomcat/util/codec/binary/Base64

7

我仍在努力理解过时的官方Spring教程

这次,主题是错误:

c:\Users\mkumpan\Projects\Spring testing\build.xml:152: java.lang.NoClassDefFoundError: org/apache/tomcat/util/codec/binary/Base64
<stack trace dump omitted>

这个类实际上包含在tomcat-util.jar中:

bash-3.1$ pwd
/c/Program Files/Tomcat/lib
bash-3.1$ jar -tf ./tomcat-util.jar | grep Base64
org/apache/tomcat/util/codec/binary/Base64.class

我非常确定我已经在build.xml中包含了它:

<fileset dir="${appserver.home}/bin">
    <include name="*.jar"/>
</fileset>

我甚至试图更加明确:

<fileset dir="C:\Program Files\Tomcat\lib\" includes="tomcat-util.jar">

无法正常工作,每次尝试运行任何与tomcat相关的目标时仍然收到该消息。也许有人可以建议一条调查线索吗?

谷歌似乎没有提供任何相关信息。

更新: 下面提供完整的主类路径参考。

<path id="master-classpath">
    <fileset dir="${web.dir}/WEB-INF/lib">
        <include name="*/*.jar"/>
    </fileset>

    <fileset dir="${appserver.lib}">
        <include name="*.jar"/>
    </fileset>

    <fileset dir="${appserver.home}/bin">
        <include name="*.jar"/>
    </fileset>

    <pathelement path="${build.dir}"/>
</path>

@Paul Grime,应用程序编译正常。这是一个ant部署脚本的一部分,该脚本应该运行Tomcat任务。我尝试启动的任何Tomcat任务都会失败并显示此错误。预部署部分和应用程序构建本身都成功了。 - Maxim Kumpan
可能是类路径问题。这些问题可能会变得非常神秘... - Donal Fellows
哪些目标失败了?您是否在 taskdef 定义中设置了此类路径?也许它被任务使用,但不在它们所加载的类加载器中。 - akostadinov
@akostadinov,看起来你把它搞定了。我没有注意到taskdef都有不同的classpath引用,而其中一个省略了tomcat-util.jar。发表一个答案,我会接受它。 - Maxim Kumpan
Tomcat在其内部使用类加载器时会出现奇怪的问题;出错是完全有可能的。 - Donal Fellows
显示剩余2条评论
5个回答

4
如果在build.xml和build.properties中使用以下与Tomcat相关的条目,则Ant部署应该在Tomcat 7及以上版本中正常工作。
<!-- ============================================================== -->
<!-- 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-util.jar"/>
    </fileset>
</path>

<taskdef name="install" classname="org.apache.catalina.ant.DeployTask">
    <classpath refid="catalina-ant-classpath"/>
</taskdef>
<taskdef name="reload" classname="org.apache.catalina.ant.ReloadTask">
    <classpath refid="catalina-ant-classpath"/>
</taskdef>
<taskdef name="list" classname="org.apache.catalina.ant.ListTask">
    <classpath refid="catalina-ant-classpath"/>
</taskdef>
<taskdef name="start" classname="org.apache.catalina.ant.StartTask">
    <classpath refid="catalina-ant-classpath"/>
</taskdef>
<taskdef name="stop" classname="org.apache.catalina.ant.StopTask">
    <classpath refid="catalina-ant-classpath"/>
</taskdef>

<target name="install" description="Install application in Tomcat">
    <install url="${tomcat.manager.url}"
             username="${tomcat.manager.username}"
             password="${tomcat.manager.password}"
             path="/${name}"
             war="${name}"/>
</target>

<target name="reload" description="Reload application in Tomcat">
    <reload url="${tomcat.manager.url}"
             username="${tomcat.manager.username}"
             password="${tomcat.manager.password}"
             path="/${name}"/>
</target>

<target name="start" description="Start Tomcat application">
    <start url="${tomcat.manager.url}"
             username="${tomcat.manager.username}"
             password="${tomcat.manager.password}"
             path="/${name}"/>
</target>

<target name="stop" description="Stop Tomcat application">
    <stop url="${tomcat.manager.url}"
             username="${tomcat.manager.username}"
             password="${tomcat.manager.password}"
             path="/${name}"/>
</target>

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

<!-- End Tomcat tasks -->

同时,确保在tomcat安装/conf目录下的tomcat-users.xml中添加以下条目:

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

1
在Tomcat 8中添加一行<include name="tomcat-util.jar"/>有所帮助。 - Scadge

4

在必要的目标中使用了错误的路径引用,其中不包含到非常需要的tomcat-util.jar的路径。

向@akostadinov表示感谢,给了正确方向的提示。


0
在Tomcat 8中,相关的库似乎是“tomcat-util.jar”,而不是“tomcat-coyote” :-)

0

对于可能遇到Tomcat 7问题的任何人来说,看起来在7.0.39版本中将org/apache/tomcat/util/codec/binary/Base64添加到了tomcat-coyote.jar中。

所以我认为有以下几个选择:

  • 升级到7.0.39+版本
  • 从其他地方使用org/apache/commons/codec/binary/Base64(commons-codec:commons-codec)

0

对于 tomcat 版本在 7 及以上,只需在您的 build.xml 文件中包含 tomcat-util.jar 即可。

<fileset dir="${appserver.lib}">
    ...
    <include name="tomcat-util.jar"/>
    ...
</fileset>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接