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 文件解决了问题。