首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Gradle构建Kotlin + Java 9项目

用Gradle构建Kotlin + Java 9项目
EN

Stack Overflow用户
提问于 2017-12-05 15:59:06
回答 5查看 10K关注 0票数 21

我对Gradle相当陌生(老实说,Java 9 ),我正在尝试使用Gradle来构建一个简单的库项目,它是Java 9和Kotlin的混合体。更详细地说,Java中有一个接口,Kotlin中有一个实现;我会用Kotlin做所有事情,但是modules-info.java无论如何都是java,所以我决定这样做。

我构建在IntelliJ Idea的基础上,外部定义了1.2.0Kotlin插件和gradle 4.3.1。

文件系统模式是:

代码语言:javascript
复制
+ src
  + main
    + java
      + some.package
        - Roundabout.java [an interface]
      - module-info.java
    + kotlin
      + some.package.impl
        - RoundaboutImpl.kt [implementing the interface]

module-info.java是:

代码语言:javascript
复制
module some.package {
  requires kotlin.stdlib;
  exports some.package;
}

build.gradle是:

代码语言:javascript
复制
buildscript {
    ext.kotlin_version = '1.2.0'

    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

group 'some.package'
version '1.0-PRE_ALPHA'

apply plugin: 'java-library'
apply plugin: 'kotlin'

tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}

sourceCompatibility = 9

compileJava {
    dependsOn(':compileKotlin')
    doFirst {
        options.compilerArgs = [
                '--module-path', classpath.asPath,
        ]
        classpath = files()
    }
}

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib', version: "$kotlin_version"
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

请注意,我必须在java编译任务上指定模块路径,否则编译失败:

错误:找不到模块: kotlin.stdlib需要kotlin.stdlib;

不管怎么说,现在这个构建失败了,我不知道如何解决它:

错误:包some.package.impl不存在 进口some.package.impl.RoundaboutImpl; 错误:找不到符号 返回新的RoundaboutImpl<>(queueSize,并行,worker,threadPool);

我认为编译的Kotlin部分运行良好,那么java部分就会失败,因为它不能“看到”kotlin方面,可以说。

我想我应该告诉它如何在类路径中加载已经编译的kotlin类;但是(首先)如何在gradle中做到这一点?第二,这可能吗?我认为在Java 9中不能混合模块路径和类路径。

我怎么才能解决这个问题?我认为这是一种非常常见的情况,因为每个java9 9风格的模块都将是一个混合语言模块(因为有module-info.java),所以我认为这里缺少一些非常基本的东西。

提前感谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-12-06 08:18:29

解决了!只需将kotlin编译dir设置为与Java相同的dir即可:

代码语言:javascript
复制
compileKotlin.destinationDir = compileJava.destinationDir

它现在可以工作了,无论是在同一棵树中的源还是在不同的树中;但是有一种奇怪的情况:jar任务生成一个包含所有重复条目的jar。我会努力解决这个问题的,下一个。

感谢大家!

票数 16
EN

Stack Overflow用户

发布于 2018-03-14 21:33:32

我正在使用下面的gradle脚本,其中我将模块info.java放在src/module下。它会自动包含在jar中(没有副本):

代码语言:javascript
复制
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
        }
    }
}

我不会再更新它了,请看一下https://github.com/robstoll/atrium/blob/master/build.gradle,看看正在使用的当前版本。

票数 2
EN

Stack Overflow用户

发布于 2019-10-03 16:48:21

接受的答案对我没有用(至少对我来说不是这样),但这才是有效的:

代码语言:javascript
复制
plugins {
    id "org.jetbrains.kotlin.jvm" version "1.3.50"
}

compileKotlin {
    doFirst {
        destinationDir = compileJava.destinationDir
    }
}

jar {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

正如公认的答案所暗示的那样,这导致我犯了这个错误:

目录'/path/to/project/build/classes/kotlin/main‘指定为属性'compileKotlinOutputClasses’不存在。

分级版本:5.6

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47657755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档