【问题标题】:Load Java class when starting Tomcat启动Tomcat时加载Java类
【发布时间】:2019-12-30 23:43:46
【问题描述】:

我试图在 tomcat 上运行项目后立即读取 java 类,但我得到 java 类错误未找到异常

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app 
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

<listener>
    <listener-class>
        Bot.CarregarBot
    </listener-class>
</listener>


</web-app>

我在运行项目时要加载的类是Bot.CarregarBot类;

当我运行项目并启动服务器时,我收到以下错误:

GRAVE: Error configuring application listener of class [Bot.CarregarBot]
java.lang.ClassNotFoundException: Bot.CarregarBot
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1365)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1188)
    at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:540)
    at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:521)
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:150)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4607)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5146)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
    at java.util.concurrent.AbstractExecutorService.submit(Unknown Source)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909)
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:841)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
    at java.util.concurrent.AbstractExecutorService.submit(Unknown Source)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909)
    at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)

类 CarregarBot.java

package Bot;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

    public class CarregarBot implements ServletContextListener {
        String action;
        String requestA;
        String responseA;
        org.alicebot.ab.Bot bot;

        @Override
        public void contextInitialized(ServletContextEvent servletContextEvent) {
            System.out.println("Starting up!");
            org.alicebot.ab.MagicStrings.setRootPath();
            org.alicebot.ab.AIMLProcessor.extension =  new org.alicebot.ab.PCAIMLProcessorExtension();
            String botName = "alice2";
            action = "chat";
            bot = new org.alicebot.ab.Bot(botName, org.alicebot.ab.MagicStrings.root_path, action); 


            System.out.println("--- Carregou Classe ---");      
        }

        @Override
        public void contextDestroyed(ServletContextEvent servletContextEvent) {
            System.out.println("Shutting down!");
        }
    }

【问题讨论】:

  • 在编译之前,.java 不是 .class。你有编译代码的构建环境吗?
  • 能否请您也包括监听器类(CarregarBot.java)
  • 另外,强烈推荐的做法是以小写开头的包命名(例如 Bot 应该是 bot) 它不会以任何方式影响代码的执行,这只是一个方法问题
  • @IvanTomić 在我的问题中添加了 de CarregarBot.java

标签: java tomcat tomcat9


【解决方案1】:

好的,所以您的代码看起来都很好(嗯,可操作),没有问题。 我 99% 确定这不是代码问题,而是构建/部署问题。

我建议您执行以下操作:

0) 如果您使用 Maven 并且有 servlet-api 依赖项,请检查 servlet-api 依赖项范围(如果您更改任何内容,请从 Maven 上下文菜单中进行项目更新),否则请确保检查导出和部署程序集

1) 清理项目(在 eclipse Project -> Clean 中)

2) 清理 tomcat 工作目录并部署和/或重新部署(或启动一个全新的 Tomcat 实例)

3) 如果它仍然不起作用,请尝试打开 war 文件(或者如果从 eclipse 部署,请转到 Tomcat 工作目录并导航到侦听器应位于的文件夹)并检查它是否确实存在。

4) 如果没有,请查看您是否可以在 问题 视图中找到关于为什么它没有被构建的任何问题

5) 如果问题仍然存在,请检查 @Shailendra 所描述的类输出文件夹设置的内容,然后重做步骤 1-4。

【讨论】:

    【解决方案2】:

    通常在典型的 java web 应用程序 (war) 结构中 - 编译后的类文件应该在 WEB-INF/classes 文件夹中结束(除非它们可以归档为 jar,否则它们也可以在 WEB-INF/lib 中) .所以尝试将项目的构建路径更改为&lt;your-project&gt;/WebContent/WEB-INF/classes。您可以参考下面的屏幕截图 这是我尝试使用的类以及启动服务器时控制台上的输出

    package Bot;
    
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    
    /**
     * Application Lifecycle Listener implementation class CarregarBot
     *
     */
    
    public class CarregarBot implements ServletContextListener {
    
        @Override
        public void contextInitialized(ServletContextEvent event) {
            System.out.println("CarregarBot initialized");
        }
    
        @Override
        public void contextDestroyed(ServletContextEvent event) {
    
        }
    
    }
    

    控制台输出

    Aug 27, 2019 1:22:47 AM org.apache.catalina.core.StandardContext reload
    INFO: Reloading Context with name [/TestWebApp] has started
    CarregarBot initialized
    Aug 27, 2019 1:22:47 AM org.apache.catalina.core.StandardContext reload
    INFO: Reloading Context with name [/TestWebApp] is completed
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 2017-02-13
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 2012-11-08
      相关资源
      最近更新 更多