除了明显的错误配置问题之外,还有啥可能导致 Servlet 过滤器的 ClassNotFoundException?
Posted
技术标签:
【中文标题】除了明显的错误配置问题之外,还有啥可能导致 Servlet 过滤器的 ClassNotFoundException?【英文标题】:What could cause a ClassNotFoundException for a Servlet Filter other than the obvious misconfiguration issues?除了明显的错误配置问题之外,还有什么可能导致 Servlet 过滤器的 ClassNotFoundException? 【发布时间】:2015-07-19 22:38:53 【问题描述】:除了明显的错误配置问题之外,还有什么可能导致 Servlet 过滤器出现 ClassNotFoundException?
我已经在我的 web.xml 文件中定义了 servlet 过滤器:
<filter>
<filter-name>SecurityFilter</filter-name>
<filter-class>com.foo.security.SecurityFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SecurityFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
而且,我已经在我的班级中定义了 servlet 过滤器:
package com.foo.security;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
public class SecurityFilter implements Filter
private static final int MAX_LENGTH = 4096;
@Override
public void init(FilterConfig filterConfig) throws ServletException
System.out.println("Initializing SecurityFilter!!!");
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
try
System.out.println("Calling SecurityFilter.doFilter()!!!");
chain.doFilter(request, response);
catch(Exception e)
finally
@Override
public void destroy()
System.out.println("Destroying SecurityFilter!!!");
并且我已经确保它包含在一个 JAR 文件中,并且该 JAR 文件包含在 WEB-INF/lib 目录中,并且该类也包含在 WEB-INF/classes 目录中。
但是,我不断收到此异常:
2015-05-06 13:01:42.926 ERROR [ScannerThread] org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/testApp] - Exception starting filter SecurityFilter
java.lang.ClassNotFoundException: com.foo.security.SecurityFilter
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)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:249)
at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:397)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:108)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3722)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4367)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:790)
at org.apache.catalina.core.ContainerBase.access$000(ContainerBase.java:122)
at org.apache.catalina.core.ContainerBase$PrivilegedAddChild.run(ContainerBase.java:144)
at java.security.AccessController.doPrivileged(Native Method)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:768)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:553)
at sun.reflect.GeneratedMethodAccessor512.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
JAR 文件的内容如下:
META-INF/
META-INF/MANIFEST.MF
com/
com/foo/
com/foo/security/
com/foo/security/SecurityFilter.class
以下是 WAR 文件的内容:
META-INF/
META-INF/MANIFEST.MF
WEB-INF/
WEB-INF/classes/
WEB-INF/classes/com/
WEB-INF/classes/com/foo/
WEB-INF/classes/com/foo/security/
WEB-INF/lib/
WEB-INF/classes/com/foo/security/SecurityFilter.class
WEB-INF/jboss-web.xml
WEB-INF/lib/com.foo.security.jar
WEB-INF/web.xml
【问题讨论】:
您是否检查过您的过滤器类是否在正确的包中:com.ge.de.security ? 您仍然可以编辑您的问题以包含补语... 我认为 Spring 不会阻止您声明标准过滤器。仔细检查您的配置和启动日志。你应该错过了什么。 嗯..我一直在看这个 1/2 天,但我没有看到它。一切对我来说似乎都是正确的。顺便说一句 - 这也不是我第一次创建过滤器,我已经使用过滤器好几年了。我将所有内容重命名为 com.foo.security 包并用它编辑了原始帖子。 检查此链接可能会有所帮助,***.com/questions/11659047/… 【参考方案1】:问题是:过滤器类是应用程序启动时最先加载的外部依赖项之一。因此,有很多可能的原因会表现为“未找到过滤器类”,实际上只是未找到常规类。
这里有几件事要检查(希望其他人可以随着时间的推移添加到此列表中):
Maven / Eclipse / Tomcat 之间的不良交互:Tomcat throws ClassNotFound exceptions for classes in other open eclipse projects【讨论】:
以上是关于除了明显的错误配置问题之外,还有啥可能导致 Servlet 过滤器的 ClassNotFoundException?的主要内容,如果未能解决你的问题,请参考以下文章
除了减少混乱之外,还有啥理由清理 Java 中未使用的导入?
除了按位否定运算之外,“~”在 python 中还有啥作用? [复制]
模块化 JavaScript - 除了 CommonJS 和 AMD 之外,还有啥方法可以考虑吗?
关于客户端安全性,CORS 除了颠覆同源策略之外还有啥作用?