簡體   English   中英

啟動Tomcat時加載Java類

[英]Load Java class when starting Tomcat

我試圖在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 Web應用程序(war)結構中-編譯的類文件應最終存儲在WEB-INF/classes文件夾中(除非可以將它們歸檔為jar,然后也可以將其存儲在WEB-INF / lib中)。 因此,請嘗試將項目的構建路徑更改為<your-project>/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

好的,因此您的代碼看起來一切正常(正常運行),在那里沒有問題。 我99%確信這不是代碼問題,而是構建/部署。

我建議您執行以下操作:

0)如果您使用Maven並具有servlet-api依賴關系,請檢查servlet-api依賴關系范圍(如果進行任何更改,請從maven上下文菜單中進行項目更新),否則請確保檢查導出和部署程序集

1)清理項目(在Eclipse項目->清理)

2)清理tomcat工作目錄,然后部署和/或重新部署(或啟動一個全新的Tomcat實例)

3)如果仍然無法正常工作,請嘗試打開war文件(或者如果從eclipse部署,請轉到Tomcat工作目錄並導航至偵聽器應位於的文件夾),然后檢查它是否確實存在。

4)如果沒有,請查看在“ 問題”視圖中是否可以找到關於未構建它的原因的任何問題

5)如果問題仍然存在,還請按照@Shailendra的說明檢查類輸出文件夾的設置,然后重做步驟1-4。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM