java meta info_java-JPMS是否支持来自META-INF / services的自动...

Here您可以找到以下有关自动模块的信息:

The module system also scans META-INF/services and makes the automatic

module provide the services named therein. An automatic module is

assumed allowed to use all 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-INF / services提供服务.但是,它不起作用,它给出以下内容:

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.(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

我决定将module-info添加到log4j-slf4j-impl-2.11.1.jar并通过providers with …以JPMS方式导出服务…并且问题得以解决-我没有收到任何NoClassDefFoundError错误.这是link的问题.

所以我的问题是:

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

>如果是,那么如何解释这种行为?

编辑

共有5个模块:

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.jar具有META-INF / services时运行–show-module-resolution,则会得到以下输出(我用…替换了完整路径):

...

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.jar具有module-info时运行–show-module-resolution,则会得到以下输出:

...

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).在VARIANT 2中,来自org.apache.logging.log4j.slf4j的服务从org.apache.logging.log4j.core加载所有类,一切正常.我们在变量2的输出中看到一条线

org.apache.logging.log4j.slf4j requires org.apache.logging.log4j.core

并且在VARIANT 1中没有这样的行.这是问题所在吗?但是,如果两个模块是自动的,是否不能自动解决?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值