Ant, Tomcat构建错误:java.lang.NoClassDefFoundError: org/apache/t



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

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

所以接下来我开始用jar -tf探测jar,看看是否有包含这个类。我发现tomcat-coyote.jar有这门课。即使在文件集中包含了这个,问题也没有解决。

有人有什么想法吗?

我通过将类路径更改为

使其工作。
<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>

像Jason一样,我尝试了Aidan的答案,但它不起作用。在TomCat 7中,管理器界面有一点变化。而不是在URL中使用/manager/list,你必须使用/manager/text/list。因此,我将build.xml中的列表任务更改为:

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

我还必须为我的admin用户添加"manager-script"角色,以便它具有执行此操作的适当权限:

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

我在遵循相同的教程时发现了相同的错误。我必须做3个改动,这样目标才能正常运行。

首先,更改build.xml "list"目标以添加上面提到的/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"/>

然后它为我工作=)

这似乎为我工作(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"/>

为了使所有ant命令工作,可以在构建中更改管理器url。当在build.xml文件中定义"list"目标时,不需要更改url。

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

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

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

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

Run -> Run configuration ->选择您的程序,选择右侧的Classpath选项卡,单击User Entries,然后从tomcat目录中添加外部jar

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

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

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

我使用opensuse。

我使用的是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>

我新到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>

在做了上述更改并运行"ant list"后,我得到的错误如下:java.io.FileNotFoundException:……/经理/文本/列表"。解决这个问题的方法是从tomcat的安装目录启动tomcat,而不是使用eclipse来启动它。启动tomcat后,首先在浏览器中尝试"localhost:8080"。这将显示tomcat页面。然后尝试运行"ant list"。它的工作和上述问题得到解决。

我建议对前面的答案做一点小小的修改。

在Tomcat 7文档中,强烈不建议配置一个用户同时拥有manager-gui和manager-script角色1。它会使您的站点容易受到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用户的用户名和密码,因此没有负担提供更安全的配置。

三件事-

  • 如果使用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

三件事-

如果使用Tomcat 7。修改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

您只需将catalina-ant.jar tomcat-coyote.jartomcat-util.jartomcat_home/lib/目录添加到ant_home/lib/目录

相关内容

  • 没有找到相关文章

最新更新