将SLF与Java9模块一起使用

mic*_*has 17 java slf4j gradle java-9 java-module

我使用java 9模块设置了一个小测试项目.结构如下所示:

.
??? build.gradle
??? src
    ??? main
    ?   ??? java
    ?       ??? module-info.java
    ?       ??? slfTest
    ?           ??? Main.java
    ??? test
        ??? java
            ??? slfTest
                ??? MainTest.java
Run Code Online (Sandbox Code Playgroud)

(随意克隆,看一看自己:git clone https://github.com/michas2/slfTest.git)

Main和Main Test类只记录一些简单的输出:

    Logger logger = LoggerFactory.getLogger(Main.class);
    logger.info("Hello World");
Run Code Online (Sandbox Code Playgroud)

现在gradle run按预期工作,但gradle test给出了ClassCastException.

    $ gradle run -q
    [main] INFO slfTest.Main - Hello World
    $ gradle test -q
    java.lang.ClassCastException: org.slf4j.simple/org.slf4j.simple.SimpleLoggerFactory cannot be cast to org.gradle.internal.logging.slf4j.OutputEventListenerBackedLoggerContext
            at org.gradle.internal.logging.slf4j.Slf4jLoggingConfigurer.configure(Slf4jLoggingConfigurer.java:42)
            at org.gradle.internal.logging.config.LoggingSystemAdapter.startCapture(LoggingSystemAdapter.java:54)
            at org.gradle.internal.logging.services.DefaultLoggingManager$StartableLoggingSystem.start(DefaultLoggingManager.java:297)
            at org.gradle.internal.logging.services.DefaultLoggingManager.start(DefaultLoggingManager.java:73)
            at org.gradle.internal.logging.services.DefaultLoggingManager.start(DefaultLoggingManager.java:37)
            at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:83)
            at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:64)
            at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:62)
            at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:67)
Run Code Online (Sandbox Code Playgroud)

删除java 9模块使事情再次发挥作用.因此我假设存在模块访问问题. - 解决问题的正确方法是什么?


内容module-info.java是:

module slfTest {
    requires  org.slf4j;
    exports slfTest;
}
Run Code Online (Sandbox Code Playgroud)

当gradle运行测试时,gradle会尝试注入自己的日志记录后端. - 猜猜这是出现一些模块访问问题的部分.