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