Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Maven tomcat7中java.util.logging处理程序的ClassNotFoundException:运行_Maven_Tomcat_Tomcat7_Maven Tomcat Plugin_Java.util.logging - Fatal编程技术网

Maven tomcat7中java.util.logging处理程序的ClassNotFoundException:运行

Maven tomcat7中java.util.logging处理程序的ClassNotFoundException:运行,maven,tomcat,tomcat7,maven-tomcat-plugin,java.util.logging,Maven,Tomcat,Tomcat7,Maven Tomcat Plugin,Java.util.logging,我遵循了关于将BIRT的日志记录(它似乎基于java.util.logging)重定向到log4j的建议,log4j是我项目的标准 我随后制作了一个BIRT记录器,如下所示: public class BirtLogger extends Handler { private final Logger log = Logger.getLogger(BirtLogger.class); @Override public void publish(LogRecord reco

我遵循了关于将BIRT的日志记录(它似乎基于
java.util.logging
)重定向到log4j的建议,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
我在三个地方使用此配置:

  • Eclipse-->工作正常
  • Tomcat-->工作正常
  • org.apache.tomcat.maven:tomcat7 maven插件: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插件,可能有一些类加载特性,我还没有完全掌握


    我在谷歌上搜索了很多,找到了一堆“假定”的解决方案,但这些解决方案对我一点帮助都没有,现在我已经没有主意了。非常感谢您的帮助。

    从stacktrace,它正在尝试使用标准LogManager加载处理程序。如果您正在处理从中看不到的任何类加载器,您将遇到和

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

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

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

    应该类似于以下内容,原因是在应用程序完全加载之前必须加载类:

    您的类需要对org.apache.log4j模块可见。
    把它放在耳朵里也没用。EAR部署是独立的 本身

    你也可以

    • 修改org.apache.log4j模块以使 jar作为资源(将其复制到其中)
    • 或者使用JAR创建新模块,然后将log4j模块修改为 对它有依赖性

    您真的验证了记录器是否在CP上吗?是的,我可以从应用程序中的其他类实例化它,并且验证了其完全限定名的正确拼写。而且,同样的配置在Eclipse中工作,更重要的是:在将WAR部署到实际的Tomcat时。这似乎是一个足够简单的问题,因此我有点困惑,因为没有人能为我提供任何指导。如前所述,它位于应用程序的类路径上。但是你是对的,它不在系统类路径上,按照你的建议进行测试。你知道如何按照Maven配置或编程方式将它放到系统类路径上吗?我不知道。检查Maven文档。错误的包/类名也会引发此类错误。仔细检查您的配置文件。