启动时加载 Java class Tomcat
Load Java class when starting Tomcat
我试图在 运行 tomcat 上的项目后立即阅读 java class,但我得到了 java class错误未发现异常
<?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>
class我要加载的时候运行项目是Bot.CarregarBotclass;
当我 运行 项目和服务器启动时,出现以下错误:
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)
class 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 网络应用程序 (war) 结构中 - 已编译的 class 文件最终应位于 WEB-INF/classes
文件夹中(除非它们可以存档为一个罐子然后它们也可以在 WEB-INF/lib 中)。因此,请尝试将项目的构建路径更改为 <your-project>/WebContent/WEB-INF/classes
。您可以参考下面的屏幕截图
这是 class 我尝试使用和启动服务器时控制台上的输出
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% 确定这不是代码问题,而是 building/deployment.
我建议您执行以下操作:
0) 如果您使用 Maven 并且有 servlet-api 依赖项,请检查 servlet-api 依赖项范围(如果您更改任何内容,请从 Maven 上下文菜单中更新项目) ,否则请确保检查导出和部署程序集
1) 清理项目(在 eclipse Project -> Clean 中)
2) 清理 tomcat 工作目录并部署 and/or 重新部署(或启动 Tomcat 的全新实例)
3) 如果它仍然不起作用尝试打开 war 文件(或者如果从 eclipse 部署到 Tomcat 工作目录并导航到监听器应该位于的文件夹)并检查它是否确实存在。
4) 如果没有,请查看是否可以在 问题 视图中找到任何关于为什么没有构建的问题
5) 如果问题仍然存在,请检查 class 输出文件夹设置的内容,如@Shailendra 所述并重做步骤 1-4。
我试图在 运行 tomcat 上的项目后立即阅读 java class,但我得到了 java class错误未发现异常
<?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>
class我要加载的时候运行项目是Bot.CarregarBotclass;
当我 运行 项目和服务器启动时,出现以下错误:
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)
class 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 网络应用程序 (war) 结构中 - 已编译的 class 文件最终应位于 WEB-INF/classes
文件夹中(除非它们可以存档为一个罐子然后它们也可以在 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% 确定这不是代码问题,而是 building/deployment.
我建议您执行以下操作:
0) 如果您使用 Maven 并且有 servlet-api 依赖项,请检查 servlet-api 依赖项范围(如果您更改任何内容,请从 Maven 上下文菜单中更新项目) ,否则请确保检查导出和部署程序集
1) 清理项目(在 eclipse Project -> Clean 中)
2) 清理 tomcat 工作目录并部署 and/or 重新部署(或启动 Tomcat 的全新实例)
3) 如果它仍然不起作用尝试打开 war 文件(或者如果从 eclipse 部署到 Tomcat 工作目录并导航到监听器应该位于的文件夹)并检查它是否确实存在。
4) 如果没有,请查看是否可以在 问题 视图中找到任何关于为什么没有构建的问题
5) 如果问题仍然存在,请检查 class 输出文件夹设置的内容,如@Shailendra 所述并重做步骤 1-4。