Log4j2/Slf4j 和 Java 11

Posted

技术标签:

【中文标题】Log4j2/Slf4j 和 Java 11【英文标题】:Log4j2/Slf4j and Java 11 【发布时间】:2019-05-11 20:17:39 【问题描述】:

我目前正在尝试使用 log4j/slf4j 和 java 11 构建一个应用程序,但我在运行时遇到了这个问题:

2018-12-10 22:09:27,225 main INFO Cannot initialize scripting support because this JRE does not support it. java.lang.NoClassDefFoundError: javax/script/ScriptEngineManager
    at org.apache.logging.log4j.core@2.11.1/org.apache.logging.log4j.core.script.ScriptManager.<init>(ScriptManager.java:69)
    at org.apache.logging.log4j.core@2.11.1/org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:216)
    at org.apache.logging.log4j.core@2.11.1/org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:250)
    at org.apache.logging.log4j.core@2.11.1/org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:547)
    at org.apache.logging.log4j.core@2.11.1/org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:619)
    at org.apache.logging.log4j.core@2.11.1/org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:636)
    at org.apache.logging.log4j.core@2.11.1/org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:231)
    at org.apache.logging.log4j.core@2.11.1/org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:153)
    at org.apache.logging.log4j.core@2.11.1/org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:45)
    at org.apache.logging.log4j/org.apache.logging.log4j.LogManager.getContext(LogManager.java:194)
    at org.apache.logging.log4j/org.apache.logging.log4j.spi.AbstractLoggerAdapter.getContext(AbstractLoggerAdapter.java:121)
    at org.apache.logging.log4j.slf4j@2.11.1/org.apache.logging.slf4j.Log4jLoggerFactory.getContext(Log4jLoggerFactory.java:49)
    at org.apache.logging.log4j/org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:46)
    at org.apache.logging.log4j.slf4j@2.11.1/org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29)
    at org.slf4j/org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:355)
    at org.slf4j/org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:380)
    at fr.mrcraftcod.nameascreated/fr.mrcraftcod.nameascreated.NameAsCreated.<clinit>(NameAsCreated.java:39)
Caused by: java.lang.ClassNotFoundException: javax.script.ScriptEngineManager
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 17 more

这个起源的代码是我的记录器的初始化:

private static final Logger LOGGER = LoggerFactory.getLogger(NameAsCreated.class);

我依赖于:

org.apache.logging.log4j:log4j-api:2.11.1 org.apache.logging.log4j:log4j-core:2.11.1 org.apache.logging.log4j:log4j-slf4j18-impl:2.11.1 一个依赖于 org.slf4j:slf4j-api:1.8.0-beta2 的 maven 项目

我使用的是 Java 版本的 OSX Mojave:

openjdk version "11" 2018-09-25
OpenJDK Runtime Environment AdoptOpenJDK (build 11+28-201810021910)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11+28-201810021910, mixed mode)

有人知道我做错了什么以及如何解决这个问题吗?

【问题讨论】:

可能与openjdk.java.net/jeps/335有关 我通常使用 Logback 来实现记录器:mvnrepository.com/artifact/ch.qos.logback/logback-classic。我没有任何进一步的想法。 @TomG 从同一链接读取非目标此弃用不会以任何方式影响 javax.script API。 org.apache.logging.log4j 是否依赖于 java.scripting?如果是这样,那么它的模块声明中肯定缺少requires java.scripting。如果它声称它是一个可选依赖项,那么问题是没有人需要 java.scripting,所以这个模块将不会被解析。您应该可以使用--add-modules java.scripting 解决它。类路径上的应用程序不会出现这个问题,因为在这种情况下,java.scripting 默认会被解析。 感谢大家的cmets。我没有尝试每一个答案,但@AlanBateman 的答案只是通过在模块信息中添加要求来工作。 :) 【参考方案1】:

根据Log4j documentation:

Log4j 支持在其某些组件中使用 JSR 223 脚本语言。

正如Alan Bateman 从 Java 9 在 cmets 中所说,您必须使用 --add-modules java.scriptingmodule-info.java 显式添加 java 脚本模块。

另请注意,模块 jdk.scripting.nashorn 是 deprecated in Java 11,将在未来的版本中删除。

【讨论】:

我还应该补充一点,这是一条信息性消息,唯一的影响是此消息,并且不支持配置中的脚本。 所以我理解正确,除非您添加此错误,否则 log4j2 将无法运行?如果有,有没有人举个例子?

以上是关于Log4j2/Slf4j 和 Java 11的主要内容,如果未能解决你的问题,请参考以下文章

Log4j 2 + Slf4j 的配置和使用

log4j2+slf4j日志不打印问题

slf4j 搭配 log4j2 处理日志

IDEA??????????????????Log4j2+Slf4j??????????????????

log-Log4j2 + SLF4j打造项目日志系统

Log4j2与Slf4j的最佳实践