简体   繁体   English

Tomcat。 导入 class 时出现 ClassNotFoundException

[英]Tomcat. ClassNotFoundException on importing class

I am writing my training project on Tomcat based java servlets and jsp's using Visual Studio Code.我正在使用 Visual Studio Code 在基于 Tomcat 的 java servlets 和 jsp 上编写我的培训项目。 Now I am working on logging.现在我正在做日志记录。 My project structure looks like this:我的项目结构如下所示:

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 realizes logging system. Class AccessFilter.java实现日志系统。 Here is code of 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;
    }
}

Code of Log.java : package FamilyTask.lib; Log.java代码:package 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);
    }
}

Command for compile servlet/filter classes:用于编译 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"

Command for compile simple classes:编译简单类的命令:

javac --release 8 -cp "D:\path\to\my\project\webapps\ROOT\WEB_INF\classes\" "<class name>.java"

Compilation ends without errors, but on run time I'm getting this error:编译结束时没有错误,但在运行时出现此错误:

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)

I solved this problem.我解决了这个问题。 The reason is that from previous compilation left log.class file (first letter is exactly lowercase letter, not Log.class ).原因是之前的编译留下了log.class文件(第一个字母完全是小写字母,而不是Log.class )。 On prev compilation log class name started from lowercase letter.在 prev 编译日志中 class 名称以小写字母开头。 On next compilations with uppercase letter names the file system replaced old log.class file with the same name file.在下次使用大写字母名称进行编译时,文件系统将旧的log.class文件替换为同名文件。 Deleting old.class file solved the problem.删除 old.class 文件解决了这个问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM