简体   繁体   English

将SLF与Java9模块一起使用

[英]Using SLF with Java9 modules

I set up a small test project using java 9 modules. 我使用java 9模块设置了一个小测试项目 The structure looks like this: 结构如下所示:

.
├── build.gradle
└── src
    ├── main
    │   └── java
    │       ├── module-info.java
    │       └── slfTest
    │           └── Main.java
    └── test
        └── java
            └── slfTest
                └── MainTest.java

(Feel free to clone and have a look yourself: git clone https://github.com/michas2/slfTest.git ) (随意克隆并自己看看: git clone https://github.com/michas2/slfTest.git

The classes Main and Main Test only log some simple output: Main和Main Test类只记录一些简单的输出:

    Logger logger = LoggerFactory.getLogger(Main.class);
    logger.info("Hello World");

Now gradle run works as expected, but gradle test gives a ClassCastException. 现在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)

Removing the java 9 module makes things work again. 删除java 9模块使事情再次发挥作用。 Therefore I assume there is module access problem. 因此我假设存在模块访问问题。 - What is the right way to fix it? - 解决问题的正确方法是什么?


The content of module-info.java is: module-info.java的内容是:

module slfTest {
    requires  org.slf4j;
    exports slfTest;
}

When gradle runs the tests, gradle tries to inject its own logging backend. 当gradle运行测试时,gradle会尝试注入自己的日志记录后端。 - Guess this is the part where some module access problem arise. - 猜猜这是出现一些模块访问问题的部分。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM