maven - Maven tomcat7 :run 中 java.util.logging 处理程序的 ClassNotFoundException

标签 maven tomcat tomcat7 maven-tomcat-plugin java.util.logging

我已经关注了 BIRT FAQ关于将 BIRT 的日志记录(似乎基于 java.util.logging)重定向到 log4j,这是我项目的标准。

我随后制作了一个 BIRT 记录器,如下所示:

public class BirtLogger extends Handler {
    private final Logger log = Logger.getLogger(BirtLogger.class);

    @Override
    public void publish(LogRecord record) {
        Level level = record.getLevel();
        String message = record.getMessage();
        if (Level.SEVERE.equals(level)) {
            log.fatal(message);
        }
        else if (Level.INFO.equals(level)) {
            log.info(message);
        }
        else if (Level.WARNING.equals(level)) {
            log.warn(message);
        }
    }
...

我的 logging.properties 如下所示:

#logging configuration for BIRT
handlers=com.totaalsoftware.fieldtracker.report.BirtLogger

我在三个地方使用这个配置:

  1. Eclipse --> 运行良好
  2. Tomcat --> 工作正常
  3. org.apache.tomcat.maven:tomcat7-maven-plugin:2.0 --> 不工作

后者在启动时给出如下错误信息:

java.lang.ClassNotFoundException: com.totaalsoftware.fieldtracker.report.BirtLogger
java.lang.ClassNotFoundException: com.totaalsoftware.fieldtracker.report.BirtLogger
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
        at java.util.logging.LogManager$3.run(LogManager.java:418)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.util.logging.LogManager.loadLoggerHandlers(LogManager.java:405)
        at java.util.logging.LogManager.initializeGlobalHandlers(LogManager.java:1076)
        at java.util.logging.LogManager.access$1100(LogManager.java:148)
        at java.util.logging.LogManager$RootLogger.getHandlers(LogManager.java:1159)
        at java.util.logging.Logger.log(Logger.java:521)
        at java.util.logging.Logger.doLog(Logger.java:543)
        at java.util.logging.Logger.logp(Logger.java:659)
        at org.apache.juli.logging.DirectJDKLog.log(DirectJDKLog.java:183)
        at org.apache.juli.logging.DirectJDKLog.info(DirectJDKLog.java:126)
        at org.apache.catalina.core.ApplicationContext.log(ApplicationContext.java:710)
        at org.apache.catalina.core.ApplicationContextFacade.log(ApplicationContextFacade.java:298)
        at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:442)
        at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:133)
        at javax.servlet.GenericServlet.init(GenericServlet.java:160)
        at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1266)
        at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1185)
        at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1080)
        at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5027)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5314)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
        at java.util.concurrent.FutureTask.run(FutureTask.java:166)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:722)

不过,我确实相信,这个“缺失的”类在应用程序的类路径中。但是对于 tomcat7 Maven 插件可能有一些我还没有完全掌握的类加载特性......

为此,我在谷歌上搜索了很多,发现了一堆“假定的”解决方案,但对我没有任何帮助,此时我已经没有想法了。非常感谢您的帮助。

最佳答案

从堆栈跟踪中,它正在尝试使用标准 LogManager 加载处理程序。如果您正在处理任何从 system class loader 中看不到的类加载器你会遇到 JDK-6448699 LogManager does not load log handler correctlyJDK-6878454 LogManager class loading inconsistent with Java EE best practices .

为了证明您的处理程序在系统类路径中可见,请尝试以下代码:

Class.forName("com.totaalsoftware.fieldtracker.report.BirtLogger", true, ClassLoader.getSystemClassLoader());

您可以将 sun.misc.URLClassPath.debug 系统属性设置为 true 或在启动时使用 -verbose:class 来获取更多关于类加载的调试信息。

关于maven - Maven tomcat7 :run 中 java.util.logging 处理程序的 ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16501138/

相关文章:

linux - 不小心删除了tomcat `webapps`文件夹

tomcat - IntelliJ IDEA : Maven,项目编译部署

java - RESTful Web 服务在本地主机服务器中运行,但不在生产服务器中运行

java - 尝试运行 HelloWorld REST 服务时出现 404

java - 从在 Tomcat 中运行的 Servlet 使用 Selenium WebDriver 的方法

Maven MultiWAR 项目 : How to deploy them all from root project?

java - 错误 java.lang.NoClassDefFoundError : org/apache/http/client/methods/HttpUriRequest

maven - 由于 REPO 网址被阻止,无法导入 Primefaces 依赖项

maven - 如何使用maven向多个.jar添加 list 属性?

maven - 具有Gradle Maven repo 依赖关系的Moqui组件