Configuring Gradle with Kotlin

11,761

Solution 1

When running gradlew clean build all projects are compiled successfully, but when running java -jar hello-kotlin-1.0-SNAPSHOT.jar I get following error...

jar {
    manifest {
        attributes 'Main-Class': 'HelloKotlinKt'
    }
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}

What is more, Intellij seems not to recognize src/main/kotlin directory as source directory (it's not marked in blue)...

sourceSets {
    main.java.srcDirs += 'src/main/kotlin'
}

Documentation and useful resources can be found here and there.

Solution 2

Why doesn't my application run?

The Jar you're creating doesn't include the kotlin runtime as Gradle will only build a Jar with your class files in it. I see you're using the application plugin so either doing $ gradle run or creating a distribution and executing through the provided shell script should work ok. If you want to ship kotlin with your Jar you'll need to create a fat jar.

Why doesn't IDEA recognise the source directory?

I suspect this is down to the fact you haven't applied the idea plugin in your build file. I haven't done any work with Kotlin, but with other languages this is required to set up the workspace correctly.

Share:
11,761
Filip Zymek
Author by

Filip Zymek

Android Developer in BLStream Poland. Love good music (every genre), sports, movies.

Updated on June 06, 2022

Comments

  • Filip Zymek
    Filip Zymek 7 months

    I am trying to use kotlin with gradle, but I am unable to succesfully create a project with Intellij Idea 15.

    I've create simple project with two modules hello-java and hello-kotlin.

    hello-java is plain java project and it is compiling and running perfectly fine.

    hello-kotlin is simple kotin module, with just one *.kt file and build.gradle file.
    Here are the sources:

    build.gradle

    group 'pl.fzymek.kotlin'
    version '1.0-SNAPSHOT'
    buildscript {
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:0.10.4"
        }
    }
    apply plugin: 'kotlin'
    apply plugin: 'application'
    mainClassName = 'HelloKotlinKt'
    repositories {
        mavenCentral()
    }
    jar {
        manifest {
            attributes 'Main-Class': mainClassName
        }
    }
    dependencies {
        compile "org.jetbrains.kotlin:kotlin-stdlib:0.10.4"
    }
    

    HelloKotlin.kt

    fun main(args: Array<String>) {
        println("Hello, Kotlin!")
    }
    

    main module settings.gradle

    include 'hello-java'
    include 'hello-kotlin'
    

    When running gradlew clean build all projects are compiled successfully, but when running java -jar hello-kotlin-1.0-SNAPSHOT.jar I get following error:

    Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
            at HelloKotlinKt.main(HelloKotlin.kt)
    Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
            at java.net.URLClassLoader.findClass(Unknown Source)
            at java.lang.ClassLoader.loadClass(Unknown Source)
            at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
            at java.lang.ClassLoader.loadClass(Unknown Source)
            ... 1 more
    

    What is more, Intellij seems not to recognize src/main/kotlin directory as source directory (it's not marked in blue) and I am not able to use auto-complete feature when editing HelloKotlin.kt file.

    Here's my project structure in Intellij project window

    enter image description here

    I've tried using Intellij option to configure modules with Kotlin(Tools->Kotlin->Configure project with Kotlin), but it gives me error that "All modules with kotlin files are configured"

    Help me stackoverflow, you are my only help.

  • Filip Zymek
    Filip Zymek about 7 years
    I just tried applying idea plugin, but it seems to have no effect. I've rebuilded project and even restarted IDE but nothing has changed.
  • tddmonkey
    tddmonkey about 7 years
    How are you importing/building your project?
  • tddmonkey
    tddmonkey about 7 years
    I've taken your build.gradle file, applied the idea plugin, run $ gradle idea and the resulting project has src/main/kotlin marked as a source directory
  • Filip Zymek
    Filip Zymek about 7 years
    I run gradlew clean build to generate jars. I'll try your solution when I get near my pc :)
  • Filip Zymek
    Filip Zymek about 7 years
    According to doc, 'sourceSets' should be updated when not using default dir structure, but this is not my case. I am using default one so I think this does not make sense to add it in 'build.gradle'
  • Filip Zymek
    Filip Zymek about 7 years
    I've deleted all intellij and gradle dirs and files and reimported project. Now src/main/kotlin is recognized properly. After adding from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } as @aga suggested, jar file can be run.
  • Alexander Udalov
    Alexander Udalov about 7 years
    Main-Class attribute in your answer would not work because Kotlin wouldn't generate a class named HelloKotlin.kt. The correct name is HelloKotlinKt.
  • aga
    aga about 7 years
    @AlexanderUdalov you're absolutely right, thanks for comment. :)