Hi folks, After updating ktlint to 1.1.1 (from 0.5...
# ktlint
s
Hi folks, After updating ktlint to 1.1.1 (from 0.50) I'm facing an error running my tests (custom rules)
Copy code
java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
	at io.github.oshai.kotlinlogging.slf4j.internal.Slf4jLoggerFactory.jLogger$kotlin_logging(Slf4jLoggerFactory.kt:11)
	at io.github.oshai.kotlinlogging.internal.KLoggerFactory.logger$kotlin_logging(KLoggerFactory.kt:16)
	at io.github.oshai.kotlinlogging.KotlinLogging.logger(KotlinLogging.kt:23)
	at io.github.oshai.kotlinlogging.KotlinLogging.logger(KotlinLogging.kt:13)
	at com.pinterest.ktlint.test.KtLintAssertThatKt.<clinit>(KtLintAssertThat.kt:36)
	at com.pinterest.ktlint.test.KtLintAssertThatAssertable.createKtLintRuleEngine(KtLintAssertThat.kt:685)
	at com.pinterest.ktlint.test.KtLintAssertThatAssertable.lint(KtLintAssertThat.kt:696)
	at com.pinterest.ktlint.test.KtLintAssertThatAssertable.hasNoLintViolations(KtLintAssertThat.kt:439)
	at com.pinterest.ktlint.test.KtLintAssertThat.hasNoLintViolations(KtLintAssertThat.kt:231)
	at com.adidas.confirmed.rules.MviViewModelRuleTest.lint class that implements MviHost and has no other public methods or properties should pass(MviViewModelRuleTest.kt:24)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.base/java.lang.reflect.Method.invoke(Unknown Source)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
	at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
	at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
	at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:112)
	at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58)
	at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:40)
	at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:60)
	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:52)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.base/java.lang.reflect.Method.invoke(Unknown Source)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
	at jdk.proxy1/jdk.proxy1.$Proxy2.processTestClass(Unknown Source)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker$2.run(TestWorker.java:176)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:129)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:100)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:60)
	at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56)
	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:113)
	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:65)
	at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69)
	at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
I already tried to include all ktlint dependencies, slf4j, but no success. This is how my build.gradle.kts looks like now:
Copy code
dependencies {
    implementation(externalLib.ktlintCli)
    implementation(externalLib.ktlintRuleEngineCore)
    implementation(externalLib.ktlintRuleEngine)
    implementation(externalLib.ktlintLogger)

    // Test Libraries
    testImplementation(externalLib.junit)
    testImplementation(externalLib.ktlintTest)
    testRuntimeOnly(externalLib.junitVintageEngine)

}
Any idea?
Adding the following dependency solves the issue
Copy code
runtimeOnly(externalLib.slf4j)
w
I've also had issues with transitive dependencies of ktlint not resolving unless explicitly declared as well, but I have no idea why
p
I would be interested to know which dependencies you mean @wakingrufus. The one mentioned above was done intentionally as integrators might want to use their own preferred logger.
w
I think it was oshai, so still logging related, but since ktlint uses it directly, it is required to have
I can provide more details later when i am at my computer
p
Sure, take your time. I am not in a hurry.