首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPMS是否支持META/服务中的自动模块服务?

JPMS是否支持META/服务中的自动模块服务?
EN

Stack Overflow用户
提问于 2018-11-05 09:00:27
回答 1查看 379关注 0票数 3

这里您可以找到有关自动模块的以下内容:

模块系统还扫描META/ services,并使自动模块提供其中指定的服务。假设允许自动模块使用所有服务。

然而,我有以下情况。我想在JPMS中使用log4j2和slf4j。为了做到这一点,log4j-slf4j-impl-2.11.1.jar必须向slf4j-api-1.8.0-beta2.jar提供JPMS服务。log4j的开发人员将log4j-slf4j-impl-2.11.1.jar作为自动模块,并通过META/services提供服务。但是,它不起作用,它提供了以下内容:

代码语言:javascript
复制
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/logging/log4j/Logger
    at org.apache.logging.log4j.slf4j@2.11.1/org.apache.logging.slf4j.SLF4JServiceProvider.initialize(SLF4JServiceProvider.java:53)
    at org.slf4j/org.slf4j.LoggerFactory.bind(LoggerFactory.java:153)
    at org.slf4j/org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:141)
    at org.slf4j/org.slf4j.LoggerFactory.getProvider(LoggerFactory.java:419)
    at org.slf4j/org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:405)
    at org.slf4j/org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:354)
    at org.slf4j/org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:380)
    at Log4j2Slf4jJdk11/com.temp.NewMain.<clinit>(NewMain.java:12)
Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.Logger
    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)
    ... 8 more

我决定将模块信息添加到log4j-slf4j-impl-2.11.1.jar中,并通过provides ... with..以JPMS方式导出服务。问题解决了--我没有得到任何NoClassDefFoundError。这是链接的问题。

所以我的问题是:

  1. JPMS是否支持自动模块的元-INF/服务服务?
  2. 如果是,那如何解释这种行为?

编辑共有5个模块:

代码语言:javascript
复制
slf4j-api-1.8.0-beta2.jar  // name: org.slf4j
log4j-slf4j18-impl-2.11.1.jar // name: org.apache.logging.log4j.slf4j
log4j-core-2.11.1.jar // name: org.apache.logging.log4j.core
log4j-api-2.11.1.jar // name: org.apache.logging.log4j
log4j2-slf4j-jdk11-1.0-SNAPSHOT.jar // name: Log4j2Slf4jJdk11

变体1,如果我运行--显示模块解析--当log4j-slf4j18-impl-2.11.1.jarMETA-INF/services时,我得到以下输出(我用...替换了完整路径):

代码语言:javascript
复制
...
root Log4j2Slf4jJdk11 file:.../log4j2-slf4j-jdk11-1.0-SNAPSHOT.jar
Log4j2Slf4jJdk11 requires org.slf4j file:.../slf4j-api-1.8.0-beta2.jar
jdk.compiler binds org.apache.logging.log4j.core file:.../log4j-core-2.11.1.jar automatic
org.slf4j binds org.apache.logging.log4j.slf4j file:.../log4j-slf4j18-impl-2.11.1.jar automatic

变体2,如果我运行--显示模块解析--当log4j-slf4j18-impl-2.11.1.jarmodule-info时,我得到以下输出:

代码语言:javascript
复制
...
root Log4j2Slf4jJdk11 file:.../log4j2-slf4j-jdk11-1.0-SNAPSHOT.jar
Log4j2Slf4jJdk11 requires org.slf4j file:.../slf4j-api-1.8.0-beta2.jar
jdk.compiler binds org.apache.logging.log4j.core file:.../log4j-core-2.11.1.jar automatic
org.slf4j binds org.apache.logging.log4j.slf4j file:.../log4j-slf4j18-impl-2.11.1.jar
org.apache.logging.log4j.slf4j requires org.slf4j file:.../slf4j-api-1.8.0-beta2.jar
org.apache.logging.log4j.slf4j requires org.apache.logging.log4j.core file:.../log4j-core-2.11.1.jar automatic
org.apache.logging.log4j.slf4j requires org.apache.logging.log4j file:.../log4j-api-2.11.1.jar
org.apache.logging.log4j binds org.apache.logging.log4j.core file:.../log4j-core-2.11.1.jar automatic

在变体1中,来自org.apache.logging.log4j.slf4j的服务不能从org.apache.logging.log4j.core加载类(org.apache.logging.log4j.Logger)。在变体2中,来自org.apache.logging.log4j.slf4j的服务从org.apache.logging.log4j.core加载所有类,一切正常。我们在变体2的输出中看到有一行

代码语言:javascript
复制
org.apache.logging.log4j.slf4j requires org.apache.logging.log4j.core

在变式1中没有这样的行,这是问题所在吗?但是如果两个模块是自动的,它们不能被自动解析吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-05 16:59:41

SLF4J 1.8需要将org.slf4j.spi.SLF4JServiceProvider实现为公开的服务。它发现在log4j-slf4j18-impl罐子中。但是,Log4j SLF4J桥需要Log4J API (模块org.apache.logging.log4j)。即使这是一个显式的Java模块,因为它只是从一个自动模块中引用,所以它没有被加载,从而导致了ClassNotFoundException。

这方面的简单解决方案是在启动应用程序时在命令行中包含--addmodules=org.apache.logging.log4j。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53151157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档