Jersey与log4j 2的兼容性-无法启动servlet

djmepvbi  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(115)

我在Jersey 1.19中使用Tomcat 7上的log4j 2时遇到了一些问题。我的项目中针对log4j 1的工作程序集由以下内容组成:

  • 软件包
  • 第12页:1.5.6
  • 对数4j:1.2.14

我有一个使用log4j 2的测试项目,它成功地工作(日志被写入一个文件),如下所示:

  • 软件包
  • 第12页:1.5.6
  • log4j-1.2-api:2.11.0
  • 日志4j-API:2.11.0
  • log4j内核:2.11.0

我在每个文档中包括了log4j-1.2-api和slf 4j-log4j 12,作为log4j 1和2之间的“桥梁”,因为有一些遗留代码我无法触及,它们使用了log4j 1。
当我从真实的项目的程序集中删除log4j 1.2.14,并添加桥(log4j-1.2-api)和log4j 2的api和core后,当启动后第一个HTTP请求命中服务器时,我会遇到以下异常。
我的log4j2.xml文件(用于测试项目)位于servlets /WEB-INF/classes文件夹中,我也在/WEB-INF文件夹中尝试过。
jar是3.3.1,如果这很重要的话-我在堆栈跟踪中看到了它。
是否有兼容性问题,我还没有读到有关让这些一起发挥?

java.lang.IllegalArgumentException
    jersey.repackaged.org.objectweb.asm.ClassReader.<init>(ClassReader.java:170)
    jersey.repackaged.org.objectweb.asm.ClassReader.<init>(ClassReader.java:153)
    jersey.repackaged.org.objectweb.asm.ClassReader.<init>(ClassReader.java:424)
    com.sun.jersey.spi.scanning.AnnotationScannerListener.onProcess(AnnotationScannerListener.java:138)
    com.sun.jersey.core.spi.scanning.JarFileScanner.scan(JarFileScanner.java:97)
    com.sun.jersey.spi.scanning.servlet.WebAppResourcesScanner$1.f(WebAppResourcesScanner.java:94)
    com.sun.jersey.core.util.Closing.f(Closing.java:71)
    com.sun.jersey.spi.scanning.servlet.WebAppResourcesScanner.scan(WebAppResourcesScanner.java:92)
    com.sun.jersey.spi.scanning.servlet.WebAppResourcesScanner.scan(WebAppResourcesScanner.java:79)
    com.sun.jersey.api.core.ScanningResourceConfig.init(ScanningResourceConfig.java:80)
    com.sun.jersey.api.core.servlet.WebAppResourceConfig.init(WebAppResourceConfig.java:102)
    com.sun.jersey.api.core.servlet.WebAppResourceConfig.<init>(WebAppResourceConfig.java:89)
    com.sun.jersey.api.core.servlet.WebAppResourceConfig.<init>(WebAppResourceConfig.java:74)
    com.sun.jersey.spi.container.servlet.WebComponent.getWebAppResourceConfig(WebComponent.java:668)
    com.sun.jersey.spi.container.servlet.ServletContainer.getDefaultResourceConfig(ServletContainer.java:435)
    com.sun.jersey.spi.container.servlet.ServletContainer.getDefaultResourceConfig(ServletContainer.java:602)
    com.sun.jersey.spi.container.servlet.WebServletConfig.getDefaultResourceConfig(WebServletConfig.java:87)
    com.sun.jersey.spi.container.servlet.WebComponent.createResourceConfig(WebComponent.java:699)
    com.sun.jersey.spi.container.servlet.WebComponent.createResourceConfig(WebComponent.java:674)
    com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:205)
    com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:394)
    com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:577)
    javax.servlet.GenericServlet.init(GenericServlet.java:158)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
    org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2549)
    org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2538)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.lang.Thread.run(Thread.java:748)
ecfdbz9o

ecfdbz9o1#

备注:虽然这是一个老问题,即使在今天,仍有一些应用程序使用Jersey 1.19.x。由于安全问题,如果在Java 7上运行,则应立即升级到Log4j 2版本2.12.4(这本身就是一个安全风险)或最新版本(如果它们在Java 8+上运行)(撰写本文时为2.17.2)。由于Jersey 1.19.x没有已知的安全问题,因此可以在以后执行其升级。

您遇到了与LOG4J2-3445中相同的问题:Log4j 2工件是多版本的,这意味着大多数类是用Java 8(旧Jersey版本支持)编译的,但有些(在/META-INF/versions/9中)是用Java 9编译的。Jersey版本中包含的类扫描程序无法解析它们。
您可以尝试多种解决方法:
1.让Tomcat扫描类而不是Jersey。这从Servlet 3.0(Tomcat 7)开始可用。要在Jersey中启用容器注解扫描,请在声明servlet时不使用<servlet-class>参数和等于javax.ws.rs.core.Application<servlet-name>

<servlet>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
</servlet>

这还可以保存一些启动时间,因为多个JavaEE技术可以从一个类扫描中获益。
1.如果上述解决方法不能解决您的问题,您可以使用com.sun.jersey.config.property.classpath servlet参数(参见javadoc)限制Jersey扫描的路径。“/WEB-INF/classes”的设置应该足以满足大多数目的。

相关问题