Building a Kotlin + Java 9 project with Gradle

前端 未结 3 1366
刺人心
刺人心 2021-02-02 13:22

I\'m fairly new to Gradle (and Java 9, to be honest), and I\'m trying to use Gradle to build a simple library project that is a mix of Java 9 and Kotlin. More in detail, there i

相关标签:
3条回答
  • 2021-02-02 14:02

    I am using the following gradle script where I put the module-info.java under src/module. It gets automatically included in the jar (without duplicates):

    if (JavaVersion.current() >= JavaVersion.VERSION_1_9) {
        subprojects {
            def srcModule = "src/module"
            def moduleInfo = file("${project.projectDir}/$srcModule/module-info.java")
            if (moduleInfo.exists()) {
    
                sourceSets {
                    module {
                        java {
                            srcDirs = [srcModule]
                            compileClasspath = main.compileClasspath
                            sourceCompatibility = '9'
                            targetCompatibility = '9'
                        }
                    }
                    main {
                        kotlin { srcDirs += [srcModule] }
                    }
                }
    
                compileModuleJava.configure {
                    dependsOn compileKotlin
                    destinationDir = compileKotlin.destinationDir
                    doFirst {
                        options.compilerArgs = ['--module-path', classpath.asPath,]
                        classpath = files()
                    }
                }
                jar.dependsOn compileModuleJava
            }
        }
    }
    

    I won't update it any longer, have a look at https://github.com/robstoll/atrium/blob/master/build.gradle to see the current version in use.

    0 讨论(0)
  • 2021-02-02 14:14

    The accepted answer did not work for me (atleast not the way it was presented), but this is what worked:

    plugins {
        id "org.jetbrains.kotlin.jvm" version "1.3.50"
    }
    
    compileKotlin {
        doFirst {
            destinationDir = compileJava.destinationDir
        }
    }
    
    jar {
        duplicatesStrategy = DuplicatesStrategy.EXCLUDE
    }
    

    Doing it the way the accepted answer suggests led to me getting this error:

    Directory '/path/to/project/build/classes/kotlin/main' specified for property 'compileKotlinOutputClasses' does not exist.


    Gradle version: 5.6

    0 讨论(0)
  • 2021-02-02 14:24

    Solved! It was sufficient to set the kotlin compilation dir to the same dir as Java:

    compileKotlin.destinationDir = compileJava.destinationDir
    

    It works now, both with the sources in the same tree or in different trees; but with a quirk: the jar task produces a jar with all the entries duplicated. I'll work on fix this, next.

    Thanks to everyone!

    0 讨论(0)
提交回复
热议问题