我正在使用visualstudio代码编写基于tomcat的javaservlet和jsp的培训项目。现在我正在做日志工作。我的项目结构如下所示:
webapps
|----ROOT
|----public
|----WEB-INF
|----classes
|----FamilyTask
|----filters
|----AccessFilter.java
|----compile_filter.bat
|----lib
|----Log.java
|----compile_class.bat
|----servlets
|----compile_servlet.bat
|----LoginServlet.java
|----lib
|----web.xml
班级 AccessFilter.java
实现了测井系统。这是密码 AccessFilter.java
:
package FamilyTask.filters;
import ...
import FamilyTask.lib.Log;
public class AccessFilter implements Filter
{
...
...
...
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
{
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
String path = req.getServletPath();
FamilyTask.lib.Log.Info("#INFO - Path :" + path + ", URL =" + req.getRequestURL());
if( path.contains("/public") ||
path.equals("/") || path.isEmpty() || path.equals("/index.jsp") ||
(path.equals("/login") && req.getMethod().toLowerCase().equals("post")))
chain.doFilter(request, response);
else
res.sendRedirect("/");
return;
}
}
代码 Log.java
:包familytask.lib;
import ...
...
import java.util.*;
import java.util.logging.*;
import javax.naming.*;
public class Log
{
private static Boolean isInit = false;
private static Logger LOGGER = null;
private static Handler handler = null;
private static void Init()
{
if(isInit && LOGGER != null)
return ;
try
{
handler = new FileHandler("debug_log");
LOGGER.addHandler(handler);
handler.setLevel(Level.ALL);
handler.close();
}
catch(IOException exc)
{
System.out.println("Error: Couldn't create or open Log file. Error message: " + exc.getMessage());
}
isInit = true;
return;
}
public static void Info(String message)
{
if(!isInit)
Log.Init();
System.out.println("Info: " + message);
LOGGER.info("Info: " + message);
}
public static void Error(String message)
{
if(!isInit)
Log.Init();
System.out.println("Error: " + message);
LOGGER.warning("Error: " + message);
}
}
编译servlet/filter类的命令:
javac --release 8 -cp "D:\path\to\my\project\webapps\ROOT\WEB_INF\classes\";"D:\path\to\my\project\lib\servlet-api.jar" "<servlet or filter name>.java"
编译简单类的命令:
javac --release 8 -cp "D:\path\to\my\project\webapps\ROOT\WEB_INF\classes\" "<class name>.java"
编译结束时没有出现错误,但在运行时出现以下错误:
Exception
javax.servlet.ServletException: При выполнении фильтра выброшено исключение
Root Cause
java.lang.NoClassDefFoundError: FamilyTask/lib/Log
FamilyTask.filters.AccessFilter.doFilter(AccessFilter.java:42)
Root Cause
java.lang.ClassNotFoundException: FamilyTask.lib.Log
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1365)
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1188)
FamilyTask.filters.AccessFilter.doFilter(AccessFilter.java:42)
1条答案
按热度按时间cedebl8k1#
我解决了这个问题。原因是从以前的编译中留下的
log.class
文件(第一个字母完全是小写字母,而不是Log.class
). 在上一个编译日志中,类名从小写字母开始。在下一次使用大写字母名称的编译中,文件系统将替换旧的log.class
同名文件。删除旧的.class文件解决了这个问题。