问题描述
我们最近将应用程序从Tomcat 7更新到了Tomcat9。与此同时,我们还将使用的JRE从jre 6更新到了OpenJDK 11。 现在到目前为止一切正常。该应用程序启动了一切,除了日志记录正在运行之外。 似乎与tomcat记录器和我们的log4j记录器存在冲突。 我们得到:
SCHWERWIEGEND [main] org.apache.catalina.core.StandardContext.loadOnStartup Servlet [StartupServlet] in web application [/Application] threw load() exception
java.lang.LinkageError: loader constraint violation: when resolving field "log" of type org.apache.log4j.Logger,the class loader org.apache.catalina.loader.ParallelWebappClassLoader @e48059 of the current class,StartupServlet,and the class loader 'app' for the field's defining type,org.fp.Main,have different Class objects for type org.apache.log4j.Logger (StartupServlet is in unnamed module of loader org.apache.catalina.loader.ParallelWebappClassLoader @e48059,parent loader java.net.urlclassloader @18f65a4; org.fp.Main is in unnamed module of loader 'app')
at StartupServlet.init(StartupServlet.java:41)
at javax.servlet.GenericServlet.init(GenericServlet.java:158)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1134)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1089)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:983)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4864)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5173)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:717)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1133)
at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1866)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(UnkNown Source)
at java.base/java.util.concurrent.FutureTask.run(UnkNown Source)
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
at java.base/java.util.concurrent.AbstractExecutorService.submit(UnkNown Source)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:1045)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:429)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1576)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:309)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:423)
at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:366)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:936)
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:841)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.core.ContainerBase$startChild.call(ContainerBase.java:1384)
at org.apache.catalina.core.ContainerBase$startChild.call(ContainerBase.java:1374)
at java.base/java.util.concurrent.FutureTask.run(UnkNown Source)
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
at java.base/java.util.concurrent.AbstractExecutorService.submit(UnkNown Source)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909)
at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.core.StandardService.startInternal(StandardService.java:421)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:930)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.startup.Catalina.start(Catalina.java:633)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(UnkNown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(UnkNown Source)
at java.base/java.lang.reflect.Method.invoke(UnkNown Source)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:343)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:474)
现在,我们仍然使用log4j 1.2.8版,并且有一个属性文件,其中设置了所有内容(模式等)。现在,我们通过使用该属性文件来更改日志路径:
Properties p = new Properties();
p.load(new FileInputStream(Main.Application+File.separator+"log4j.properties"));
p.setProperty("log4j.appender.fileout.File",logPath+File.separator+PRODUKT+".log");
PropertyConfigurator.configure(p);
此方法以前曾起作用,但现在看来这样做会使记录器崩溃。现在这不会使应用程序崩溃。一切正常,我们只是没有任何日志。
如果我们使用
BasicConfigurator.configure()
它似乎有效。该日志不在我们的日志文件中,但是tomcat日志有一个输出,看起来不错。 有人对此有想法吗?根据我对LinkageErrors的了解,在更改类(通过编译)并且旧类现在不兼容之后,就会出现问题。因此,这意味着我们将在我们的类路径中设置两个log4j-Jars。但是类路径看起来还不错。我发现tomcat配置了一个日志管理器。
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=C:/Program Files/Application/tomcat/conf/logging.properties
这可能是原因吗? 与往常一样,感谢您的帮助!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)