当前位置: 首页 > 面试题库 >

使用Gradle构建Kotlin + Java 9项目

谭富
2023-03-14
问题内容

我对Gradle(和Java 9,说实话)还很陌生,并且我正在尝试使用Gradle构建一个简单的库项目,该项目混合了Java
9和Kotlin。更详细地讲,在Java中有一个接口,在Kotlin中有一个实现。我会在Kotlin中做所有事情,但是modules- info.java无论如何都是Java,所以我决定采用这种方式。

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

文件系统架构为:

+ src
  + main
    + java
      + some.package
        - Roundabout.java [an interface]
      - module-info.java
    + kotlin
      + some.package.impl
        - RoundaboutImpl.kt [implementing the interface]

module-info.java 是:

module some.package {
  requires kotlin.stdlib;
  exports some.package;
}

并且build.gradle是:

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,parallelism,worker,threadPool);

认为 编译的Kotlin部分可以正常进行,然后java部分失败,因为可以这样说,因为它没有“看到” kotlin方面。

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

我该如何解决?我认为这是一种非常普遍的情况,因为每个java9样式的模块都将是一个混合语言模块(由于module- info.java),因此我认为这里缺少一些非常基本的东西。

提前致谢!


问题答案:

解决了!将kotlin编译目录设置为与Java相同的目录就足够了:

compileKotlin.destinationDir = compileJava.destinationDir

现在,无论是同一棵树还是不同树中的源,它都可以工作。但有一个怪癖:该jar任务生成一个jar,其中所有条目均重复。接下来,我将解决此问题。

谢谢大家!



 类似资料:
  • 不管怎样,现在这个构建由于这个错误而失败,我不知道如何解决它: 错误:package some.package.impl不存在 导入一些。package.impl.roundaboutimpl; 提前感谢!

  • 这是用Gradle构建Kotlin+Java9项目的后续。在链接后使用Groovy的Gradle。在我的情况下,使用Kotlin DSL。 基本上我有一个梯度项目与以下结构(只有相关的内容在这里): 问题:如何让链接的post(或任何其他解决方案)中提供的解决方案运行,以便使用Java9/10环境编译带有Gradle的Kotlin DSL的Kotlin项目?

  • 克隆此项目时https://github.com/artem-zinnatullin/droidcon-nyc-2017-puzzlers.git 该项目未能建立,我得到了一个错误。这似乎是rxjava lib中的问题,但我找不到。 }

  • 我正在创建一个新项目(使用IntelliJ IDEA),该项目将使用: 分级作为构建系统 构建脚本的Kotlin DSL “组织”的Java 9模块 科特林语作为主要语言 我有问题设置Gradle正确地建立我的项目。我找到的大多数示例都是针对Groovy而不是Kotlin DSL的,而且大多数示例只覆盖了我想要的一些特性,而不是全部。 lib/build.gradle.kts 执行此操作时,配置将

  • 我尝试使用gradle构建工具构建一个简单的android应用程序。但是我得到了这样的错误 方法无签名:org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.compile()适用于参数类型:(java.lang.String)值:[org.gradle.api.plugins: gradle and

  • 这个问题询问如何用Gradle构建SourceJar。我如何用Gradle Kotlin DSL做同样的事情? 分级代码为: