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

2024-01-04

我在 Tomcat7 上使用 Jersey 1.19 与 log4j2 时遇到问题。我的项目针对 log4j1 的工作程序集包含以下内容:

  • slf4j-api:1.5.6
  • slf4j-log4j12:1.5.6
  • log4j:1.2.14

我有一个使用 log4j2 的测试项目成功运行(日志写入文件),内容如下:

  • slf4j-api:1.5.6
  • slf4j-log4j12:1.5.6
  • log4j-1.2-api:2.11.0
  • log4j-api:2.11.0
  • log4j-核心:2.11.0

我在每个文档中都包含了 log4j-1.2-api 和 slf4j-log4j12 作为 log4j 1 和 2 之间的“桥梁”,因为我无法触及使用 log4j1 的遗留代码。

一旦我从真实项目的程序集中删除 log4j 1.2.14,并添加桥 (log4j-1.2-api) 以及 log4j2 的 api 和核心,当第一个 HTTP 请求到达服务器时,我就会遇到以下异常启动后。恢复到 log4j1 可以解决该问题。

我的 log4j2.xml 文件(适用于测试项目)位于 servlets /WEB-INF/classes 文件夹中。我也在/WEB-INF文件夹中尝试过。

如果这很重要的话,asm.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)

TL;DR:虽然 Jersey 1.19.x 可以扫描使用 JDK 1.8 编译的类,但它无法扫描META-INF/versions/9使用 JDK 9 编译。

Remark:虽然这是一个老问题,但即使在今天也有一些应用程序使用 Jersey 1.19.x。由于安全问题,他们应该升级到 Log4j2 版本2.12.4如果在 Java 7 上运行(这本身就是一个安全风险),则立即更新;如果在 Java 8+ 上运行,则立即更新最新版本(2.17.2在撰写本文时)。由于 Jersey 1.19.x 没有已知的安全问题,因此可以稍后进行升级。

你有同样的问题LOG4J2-3445 https://issues.apache.org/jira/browse/LOG4J2-3445:Log4j2 工件是多版本的,这意味着大多数类都是用 Java 8 编译的(受旧 Jersey 版本支持),但有些类(在/META-INF/versions/9)是用 Java 9 编译的。Jersey 版本中包含的类扫描器无法解析它们。

您可以尝试多种解决方法:

  1. 让 Tomcat 代替 Jersey 扫描类。从 Servlet 3.0 (Tomcat 7) 开始可用。要在 Jersey 中启用容器注释扫描,请声明您的 servlet,无需使用<servlet-class>参数和一个<servlet-name>等于javax.ws.rs.core.Application:
    <servlet>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
    </servlet>
    
    这还应该节省一些启动时间,因为多种 Java EE 技术可以从单个类扫描中获益。
  2. 如果上述解决方法不能解决您的问题,您可以使用以下命令限制 Jersey 扫描的路径com.sun.jersey.config.property.classpathservlet 参数(参见javadoc https://www.javadoc.io/doc/com.sun.jersey/jersey-servlet/latest/com/sun/jersey/spi/container/servlet/ServletContainer.html)。 “/WEB-INF/classes”的设置对于大多数用途来说应该足够了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jersey 与 log4j2 的兼容性 - 无法启动 servlet 的相关文章

  • 日志文件未使用 java 中的 log4j 更新/创建

    我正在尝试使用 Java 中的 log4j 捕获日志 该可执行文件位于Linux环境中 它显示日志消息 但是 它没有写入日志文件 我正在使用 log4j xml 这就是我到目前为止所拥有的
  • logback 支持 log4j 附加程序吗?

    为 log4j 创建的自定义 Appender 扩展 AppenderSkeleton 可以与 new 一起使用吗logback框架 我知道logback带有自己的一组类似于 log4j 的附加程序 但这是否可以重用现有的附加程序 如何 以
  • Log4j2 错误处理

    由于我发现 log4j 1 2 x 存在一些性能问题 因此我尝试迁移到 log4j2 现在我遇到了一个问题 我找不到解决方案 我必须将 log4j 1 2 x 的配置文件重写为 v2 兼容文件 当我到达附加程序内部的属性 称为 errorH
  • 如何在 log4j 中启用包级别日志记录

    谁能告诉我 log4j 中的包级别日志记录是什么 以及如何实现这一点 今天我的面试问题无法回答 即使我在谷歌中也没有找到好的解决方案 太感谢了 包级别日志记录是 log4j 的标准日志记录 使用 log4j 配置 您可以指定包和关联的级别
  • 在 Spark java 应用程序中使用 log4j2

    我正在尝试使用 log4j2我的 Spark 工作中的记录器 基本要求 log4j2 配置位于类路径之外 因此我需要明确指定其位置 当我直接在 IDE 中运行代码而不使用spark submit log4j2效果很好 但是 当我使用以下命令
  • Log4j 2 创建记录器时挂起

    我有这个简单的程序 package myPackage import org apache logging log4j Logger import org apache logging log4j LogManager public cla
  • 使用 Jersey 在 REST 服务中上传多个文件

    这里有很多建议使用的链接multipart form data以及如何在此处上传文件 无法真正找到一个用于通过 CURL 命令上传的多个文件的组合以及接受 REST 服务的文件FormDataMultiPart 目前服务中的代码如下所示 j
  • log4j2 在自定义 Appender 中将 printObject 设置为 true

    HERE https logging apache org log4j 2 x manual extending html它说 如果 toString 方法 附加程序应将 printObject 指定为 true 呈现传递给 Appende
  • 无法让 grizzly 日志记录工作,没有任何内容写入我的 log4j 日志文件

    我有一个简单的 Java Spring 程序 使用标准 log4j properties 文件来控制日志记录 工作正常 当我们通过以下方式添加 Grizzly 时 GrizzlyHttpServerFactory createHttpSer
  • 休息。球衣。如何以编程方式选择返回类型:JSON 或 XML?

    我有两个问题 1 我可以创建吗one类 使用 JAXB 注释对其进行注释 用于 XML 支持 并在中声明web xml
  • GSON 预期为 BEGIN_ARRAY,但实际为 BEGIN_OBJECT

    当我仅收到列表中的一项时 我收到此错误 我在服务器端 REST Web 服务中使用 Jersey 只有当列表返回一个元素并且它具有0 elements I get java lang NullPointerException但是当它有多个时
  • Maven 记录器的 SLF4J 桥

    我正在编写 Maven 3 x 插件 并想使用 SLF4J 和 Logback 进行日志记录 我发现了 Maven Logger 的一些 SLF4J 绑定 http www jcabi com jcabi maven slf4j index
  • log4j 中的异常深度

    我的 Myfaces 2 应用程序遇到实例化异常 但是通过 log4j 打印的异常会切断堆栈跟踪的其余部分 这是我所看到的 javax faces FacesException java lang InstantiationExceptio
  • SLF4J 日志记录到文件 vs. DB vs. Solr

    我需要一些关于 SLF4J 日志记录的建议 目前 我们正在为 Java Web 应用程序使用 SLF4J 日志记录 log4j 绑定 该应用程序使用简单的 ConsoleAppender 我们的下一步是研究可以保存日志的地方 我们的应用程序
  • 压缩 Log4j 文件

    是否可以压缩日志文件 我通过 RollingFileAppender 进行 log4j 附加功能 http logging apache org log4j extras 对此表示支持 只需将以下内容添加到您的RollingFileAppe
  • 在 JerseyTest 中访问 Spring beans

    我试图弄清楚如何从 JerseyTest 的子类访问 Spring bean 扩展 JerseyTest 我已经设法在测试中加载 Spring 上下文 但我还没有弄清楚如何访问 spring 上下文 我的设置如下所示 public abst
  • 如何使用 SLF4J 和 Log4j2 记录 FATAL(或任何自定义日志级别)

    我有那些具体的要求 需要能够登录FATAL level 需要使用SLF4J 需要使用Log4j2 现在 这是我的执行 final Logger logger LoggerFactory getLogger HelloWorld class
  • 如何在 Jersey 容器中配置欢迎文件 (HTML/JSP)

    我有一个 Jersey RESTful Web 服务项目 我已经在中配置了 Jersey 容器web xml一切正常 在同一个项目中 我引入了一个 HTML 页面并包含在
  • 这个奇怪的泽西警告是什么意思?

    这个警告在 Jersey 1 4 中意味着什么 WARNING A sub resource method public final java lang String com XXX render with URI template is
  • Log4j2 ThreadContext 映射不适用于parallelStream()

    我有以下示例代码 public class Test static System setProperty isThreadContextMapInheritable true private static final Logger LOGG

随机推荐