我使用java 9模块设置了一个小test project。结构如下所示:
.
├── build.gradle
└── src
├── main
│ └── java
│ ├── module-info.java
│ └── slfTest
│ └── Main.java
└── test
└── java
└── slfTest
└── MainTest.java
(随意克隆并亲眼看看:git clone https://github.com/michas2/slfTest.git
)
Main和Main Test类只记录一些简单的输出:
Logger logger = LoggerFactory.getLogger(Main.class);
logger.info("Hello World");
现在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)
删除java 9模块会使事情再次发挥作用。因此我假设存在模块访问问题。 - 解决问题的正确方法是什么?
module-info.java
的内容是:
module slfTest {
requires org.slf4j;
exports slfTest;
}
当gradle运行测试时,gradle会尝试注入自己的日志记录后端。 - 猜猜这是出现一些模块访问问题的部分。
答案 0 :(得分:1)
这是gradle中的一个已知问题。
有关更多参考,请参见此处