Krešimir Nesek
Krešimir Nesek

Reputation: 5502

Intellij not including gradle dependency on classpath when running an app

IntelliJ is not including by logback-classic dependency on classpath when running the application from IDE (it is kotlin application, but it shouldn't matter). My gradle build contains a line:

    compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.+'

Dependency is correctly listed under "External Libraries" in IntelliJ.

When I try to manually reference a class that the dependency provides in the source code, compiler doesn't complain and it compiles the code successfully. However, when I run the application I get ClassNotFoundException.

//This import is provided by logback-classic library 
import org.slf4j.impl.StaticLoggerBinder
...
// This compiles successfully, but will trigger ClassNotFoundException when run 
val singleton = StaticLoggerBinder.getSingleton()

I included the code to list out the runtime classpath:

        val cl = ClassLoader.getSystemClassLoader()
        val urls = (cl as URLClassLoader).urLs
        for (url in urls) {
            System.out.println(url.file)
        }

And the output, when run from IDE, doesn't include logback-classic. Sample output:

...
/Users/knesek/.gradle/caches/modules-2/files-2.1/commons-httpclient/commons-httpclient/3.1/964cd74171f427720480efdec40a7c7f6e58426a/commons-httpclient-3.1.jar
/Users/knesek/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-databind/2.8.8/bf88c7b27e95cbadce4e7c316a56c3efffda8026/jackson-databind-2.8.8.jar
/Users/knesek/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.module/jackson-module-jaxb-annotations/2.8.8/e2e95efc46d45be4b429b704efbb1d4b89721d3a/jackson-module-jaxb-annotations-2.8.8.jar
/Users/knesek/.gradle/caches/modules-2/files-2.1/com.sun.mail/javax.mail/1.5.6/ab5daef2f881c42c8e280cbe918ec4d7fdfd7efe/javax.mail-1.5.6.jar
/Users/knesek/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-core/1.1.11/88b8df40340eed549fb07e2613879bf6b006704d/logback-core-1.1.11.jar
/Users/knesek/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.1/98e484e67f913e934559f7f55f0c94be5593f03c/kotlin-stdlib-1.1.1.jar
/Users/knesek/.gradle/caches/modules-2/files-2.1/org.springframework/spring-beans/4.3.9.RELEASE/daa5abf3779c8cad1a2910e1ea08e4272489d8ae/spring-beans-4.3.9.RELEASE.jar
...

Fascinatingly, logback-core is in there while logback-classic is not (and logback-core is a transitive dependency of logback-classic).

I tried invalidating InteliJ cahces, rebuilding and restarting InteliJ. Compling from gradle and running the jar works fine. Any suggestions?

Upvotes: 4

Views: 3065

Answers (1)

Krešimir Nesek
Krešimir Nesek

Reputation: 5502

It seems this a bug in InteliJ for which I'll file a bug report. Including this answer with a workaround here for anyone who might encounter similar issue.

It seems that when there is a certain combinations of dependencies present on the classpath, then when you use gradle dependency like this

compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.+'

it will not get included when run from the IDE. But if you include it like this:

compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.1.+'

then it works. First example did work for a while, until I included more dependencies.

Upvotes: 1

Related Questions