Java Web项目部署报java.lang.ClassNotFoundException: AuthFilter错误如何解决
问题描述
Java Web项目部署运行时无法找到过滤器类,抛出如下异常:
java.lang.ClassNotFoundException: AuthFilter at java.net.URLClassLoader.findClass(URLClassLoader.java:382) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:348) at com.sun.grizzly.util.ClassLoaderUtil.load(ClassLoaderUtil.java:166) at com.sun.grizzly.util.ClassLoaderUtil.load(ClassLoaderUtil.java:154) at ____bootstrap.Deployer.setFilters(Deployer.java:277) at ____bootstrap.Deployer.deploy(Deployer.java:336) at ____bootstrap.Deployer.deployExpandedWar(Deployer.java:410) at ____bootstrap.Deployer.deployApplication(Deployer.java:405) at ____bootstrap.Deployer.deployApplications(Deployer.java:107) at ____bootstrap.Deployer.start(Deployer.java:203) at ____bootstrap.____Bootstrap._start(____Bootstrap.java:38) at ____bootstrap.____Bootstrap.start(____Bootstrap.java:139) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at ____embedded.____EntryPoint.invoke(____EntryPoint.java:273) at ____embedded.____EntryPoint.main(____EntryPoint.java:96)
过滤器编译后的class文件存放在WEB-INF/classes目录下,目录结构如下:
web.xml相关配置如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>ApexMod</display-name> <context-param> <param-name>version</param-name> <param-value>1.1.4.195.00.12</param-value> </context-param> <listener> <listener-class>oracle.dbtools.rt.web.SCListener</listener-class> </listener> <filter> <filter-name>AuthFilter</filter-name> <filter-class>AuthFilter</filter-class> <init-param> <param-name>debug-mode</param-name> <param-value>true</param-value> </init-param>
曾尝试将配置中的类路径修改为classes.AuthFilter和WEB-INF.classes.AuthFilter,依旧报错。
解决方案
你将过滤器class文件放在WEB-INF/classes目录的做法是正确的,该目录是Java Web容器默认的类加载根路径,不需要在类名前加WEB-INF、classes前缀,你之前修改的两种类路径写法本身不符合Java类全限定名规范。
报错的核心原因是你把AuthFilter类放在了无包名(默认包)下,你使用的基于grizzly的Web容器对默认包的类加载支持存在缺陷,无法正确识别无包名的过滤器类。
解决步骤如下:
- 给AuthFilter类添加合法包名,例如
com.example.web.filter - 将AuthFilter的源码移动到对应包结构的源码目录下,重新编译后,class文件会自动生成到
WEB-INF/classes/com/example/web/filter/AuthFilter.class路径 - 修改web.xml中的filter-class配置,填写类的全限定名:
<filter> <filter-name>AuthFilter</filter-name> <filter-class>com.example.web.filter.AuthFilter</filter-class> <!-- 其余原有配置保持不变 --> </filter> - 重新部署项目即可解决该异常。
内容的提问来源于stack exchange,提问作者user5507535
相关产品推荐
相关产品推荐

