Tomcat。导入时出现 ClassNotFoundException class
Tomcat. ClassNotFoundException on importing class
我正在使用 Tomcat 基于 java servlet 和 jsp 使用 Visual Studio 代码编写我的培训项目。现在我正在研究日志记录。我的项目结构如下所示:
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
Class 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)
我解决了这个问题。原因是之前的编译留下了log.class
个文件(第一个字母正好是小写字母,不是Log.class
)。在上一个编译日志中 class 名称以小写字母开头。在下一次使用大写字母名称的编译中,文件系统用同名文件替换了旧的 log.class
文件。删除旧的 .class 文件解决了问题。
我正在使用 Tomcat 基于 java servlet 和 jsp 使用 Visual Studio 代码编写我的培训项目。现在我正在研究日志记录。我的项目结构如下所示:
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
Class 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)
我解决了这个问题。原因是之前的编译留下了log.class
个文件(第一个字母正好是小写字母,不是Log.class
)。在上一个编译日志中 class 名称以小写字母开头。在下一次使用大写字母名称的编译中,文件系统用同名文件替换了旧的 log.class
文件。删除旧的 .class 文件解决了问题。