합니까 JPMS 지원 서비스 META-INF에서 / 서비스 자동 모듈?

Pavel_K :

여기에서 당신은 자동 모듈에 대해 다음을 찾을 수 있습니다 :

모듈 시스템은 META-INF / 서비스를 검색하고 자동 모듈 내부라는 서비스를 제공한다. 자동 모듈은 모든 서비스를 사용할 수 가정한다.

그러나, 나는 다음과 같은 상황이있다. 나는 JPMS에서 SLF4J로 log4j2 사용하고 싶습니다. 그러기 위해서는이 log4j-slf4j-impl-2.11.1.jarJPMS 서비스를하기 위해 제공해야합니다 slf4j-api-1.8.0-beta2.jar. Log4j의 개발자들은 이루어지는 log4j-slf4j-impl-2.11.1.jar자동 모듈 같이 META-INF / 서비스를 통해 서비스를 제공 하였다. 는 다음을 제공에서 그러나, 그것은 작동하지 않습니다 :

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/logging/log4j/Logger
    at [email protected]/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을 통해 JPMS 방식으로 수출 서비스 provides ... with... 그리고 문제는 해결되었다 - 내가 어떤을하지 않습니다 NoClassDefFoundError. 입니다 링크 문제에.

내 질문에 이렇게 :

  1. 자동 모듈의 서비스 / META-INF에 JPMS 지원 서비스를합니까?
  2. 예 있다면, 어떻게 그런 행동을 설명하기 위해?

EDIT 총 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

VARIANT 1 내가 --show-모듈 해상도를 실행하면 log4j-slf4j18-impl-2.11.1.jarMETA-INF/services나는 (내가 함께 전체 경로를 대체 출력의 다음 조각을 얻기를 ...)

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

VARIANT이 나는 --show-모듈 해상도를 실행하면 log4j-slf4j18-impl-2.11.1.jarmodule-infoI 출력의 다음 조각을 얻을 수를 :

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

VARIANT 1 년에서 서비스 org.apache.logging.log4j.slf4j캔 클래스를 (로드 할 org.apache.logging.log4j.Logger)에서 org.apache.logging.log4j.core. VARIANT 2에서 서비스에 org.apache.logging.log4j.slf4j부하 모든 클래스에서 org.apache.logging.log4j.core모든 것이 괜찮습니다. 선이 있음을 우리는 VARIANT 2의 OUPUT에서 볼

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

및 VARIANT 1에서 그러한 라인이있는 문제가 없다가? 이 개 모듈은 자동 있다면 그러나 그들은 자동으로 해결 될 수없는 이유는 무엇입니까?

rgoers :

SLF4J 1.8 노출 된 서비스로 org.slf4j.spi.SLF4JServiceProvider의 구현을 필요로한다. 그것은 log4j에-slf4j18-IMPL 항아리 것을 찾는 것입니다. 그러나, Log4j는 SLF4J의 다리는의 log4j API (모듈 org.apache.logging.log4j)가 필요합니다. 즉 명시 적으로 자바 모듈은 비록 그것이 단지 자동 모듈에서 참조되기 때문에, 그것은 ClassNotFoundException가 발생로드되지 않습니다.

이에 대한 간단한 해결책은 애플리케이션을 시작할 때 명령 행 --addmodules = org.apache.logging.log4j를 포함한다.

추천

출처http://43.154.161.224:23101/article/api/json?id=208219&siteId=1