Log4j2/Slf4j和Java 11

9

我目前正在尝试使用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 项目

我的操作系统是OSX Mojave,Java版本为:

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)

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


可能与 https://openjdk.java.net/jeps/335 相关。 - Thorn G
我通常使用Logback作为日志记录器的实现:https://mvnrepository.com/artifact/ch.qos.logback/logback-classic。我没有任何其他想法。 - Adam
@TomG 从同一链接中阅读非目标内容。此弃用不以任何方式影响javax.script API。 - Naman
你能分享一下你是如何构建和运行这个应用程序的吗?它是模块化的还是不是?如果可能的话,有使用任何框架吗? - Naman
4
org.apache.logging.log4j是否依赖于java.scripting?如果是,则它的模块声明中必须缺少“requires java.scripting”。如果它声称是可选依赖项,则问题在于没有人需要java.scripting,因此此模块将无法解析。你可以使用“--add-modules java.scripting”来解决这个问题。如果应用程序在类路径上,则不会遇到这个问题,因为在这种情况下,java.scripting将被默认解析。 - Alan Bateman
1
谢谢大家的评论。虽然我没有尝试每一个答案,但是@AlanBateman的答案只需要在模块信息中添加require就能够工作。 :) - RakSrinaNa
2个回答

8
根据Log4j文档的说法:

Log4j提供了对JSR 223脚本语言的支持,以在其某些组件中使用。

正如Java 9中由Alan Bateman在评论中所说,您必须显式添加Java脚本模块,方法是使用--add-modules java.scripting或在module-info.java中添加。
还要注意,模块jdk.scripting.nashorn在Java 11中已弃用,并将在未来的版本中被删除。

我还应该补充一点,这是一条信息性消息,唯一的影响将是这条消息,配置中的脚本不受支持。 - rgoers
所以我的理解是,如果不添加这个,log4j2就无法运行,是吗?如果是这样的话,有人有例子吗? - AnthonyA

0
请尝试升级到log4j2版本2.17.2或更高版本。

1
参观一下[导览],并访问[帮助]。依我看,你的所谓"答案"实际上更像是一条评论——因为你似乎不确定升级"log4j2"是否能解决问题。我认为你应该遵守SO的规则,也就是说,你不应该将评论发布为答案,仅仅是因为你的声望还不足以发表评论。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接