【问题标题】:Tomcat. ClassNotFoundException on importing class雄猫。导入类时出现 ClassNotFoundException
【发布时间】:2020-12-03 14:20:51
【问题描述】:

我正在使用 Visual Studio Code 编写基于 Tomcat 的 java servlet 和 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/过滤器类的命令:

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)

【问题讨论】:

  • AccessFilter.java 中的第 42 行是什么
  • FamilyTask.lib.Log.Info("#INFO - Path :" + path + ", URL =" + req.getRequestURL());
  • 或 Log.Info("#INFO - Path :" + path + ", URL =" + req.getRequestURL());同样的错误信息,没关系
  • @vsrukshan 你有什么想法可以解决这个问题吗?
  • 我认为你错过了一些导入

标签: java jsp tomcat servlets compilation


【解决方案1】:

我解决了这个问题。原因是之前的编译留下了log.class 文件(第一个字母完全是小写字母,而不是Log.class)。在 prev 编译日志类名从小写字母开始。在下次使用大写字母名称进行编译时,文件系统将旧的log.class 文件替换为同名文件。删除旧的 .class 文件解决了这个问题。

【讨论】:

    猜你喜欢
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    相关资源
    最近更新 更多