Maven tomcat7中java.util.logging处理程序的ClassNotFoundException:运行
我遵循了关于将BIRT的日志记录(它似乎基于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
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
我在三个地方使用此配置:
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文档。错误的包/类名也会引发此类错误。仔细检查您的配置文件。