【问题标题】:How can i compile java record with scala code?如何使用 scala 代码编译 java 记录?
【发布时间】:2021-10-11 12:54:17
【问题描述】:

我目前正在使用 Scala 和 Java 进行项目。我们想在 Java 上重写一些 Scala 代码。所以当我开始重写我的代码时,我遇到了这个问题。

CountryResponse.java:5: illegal start of type declaration

Scala 似乎无法编译 JDK 16 中引入的 Java 记录。我做了一些研究,在 GitHub 上只找到了this discussion。有人可以建议任何解决方法来编译 Java 的记录吗?

我确实尝试将 Scala 版本从 2.12.2 提高到 2.13.6,但问题没有解决。

我们使用 Java 16、Scala 2.12.2 和 Gradle 7.0.1 以及 Gradle 的 scala 和 java 插件。

这里也是我的 gradle 用于编译两个源的设置。

compileScala {
    sourceCompatibility("16")
    targetCompatibility("16")
}

sourceSets {
    main {
        java {
            srcDirs = []
        }
        scala {
            srcDirs = ['src/main/scala', 'src/main/java']
        }
    }
}

编辑:更新讨论链接

【问题讨论】:

  • Scala 不编译任何东西。您的构建工具(在本例中为 gradle)编译您的项目,其中可能包含 Java、Scala 和 Kotlin 代码。这 - CountryResponse.java:5: illegal start of type declaration 与 Scala 无关,与 gradle 无关。您需要正确配置您的 gradle 项目才能编译 Java 16 代码。
  • 你的Java源码版本相关配置在哪里?另外,系统jdk版本是多少?如果不是 Java 16(或更高版本),那么无论您使用 gradle 做什么,jdk 都无法编译它。此外,为了让您的 Scala 代码在 Java 16 下工作,Scala 的兼容版本是 Scala 2.13 的 2.13.5 和 Scala 2.12 的 2.12.14。
  • @sarveshseri 感谢您的回复!是的,你对编译绝对是正确的......我不清楚这些有问题的东西,抱歉。我的另一个项目在 java 16 上运行良好。系统 jdk 也是 16 版本。 gradew compileScala 运行时出现错误。
  • 为什么在 scala srcDirs 中有 'src/main/java' ?如果您也在使用 Gradle Scala 插件来处理 Java 16 文件,那么您可以将其从 java srcDirs 中删除。
  • 我在 scala 上的代码依赖于 java 类的源代码

标签: java scala gradle


【解决方案1】:

我使用包含 Scala 和 Java 16 源代码的以下项目进行了测试。 Scala 和 Java 源代码相互依赖。

如果您的 Java 和 Scala 源相互依赖,那么您需要将这些源放在 common 文件夹下。比如说main/jvm

您可以将所有 Java records 放在 main/java 下。只要您的 records 不依赖于 Scala 代码,这将起作用。否则,您将不得不根据依赖关系图将其分解为多个模块并进行微观管理。

Gradle 版本是 7.1,这个项目构建并运行成功(ScalaMain 和 JavaMain 都可以)。

build.gradle

plugins {
    id 'java'
    id 'scala'
}

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

compileScala {
    sourceCompatibility("16")
    targetCompatibility("16")
}

sourceSets {
    main {
        java {
            srcDirs = ['src/main/java']
        }
        scala {
            srcDirs = ['src/main/jvm']
        }
    }
}

dependencies {
    implementation 'org.scala-lang:scala-library:2.13.6'
}

main/java/TestJavaRecord.java

public record TestJavaRecord(int i) {}

main/jvm/TestScalaClass.scala

class TestScalaClass(val i: Int, val testJavaRecord: TestJavaRecord) {}

main/jvm/TestJavaClass.java

public class TestJavaClass {
    public int i;
    public TestScalaClass testScalaClass;

    public TestJavaClass(int i, TestScalaClass testScalaClass) {
        this.i = i;
        this.testScalaClass = testScalaClass;
    }
}

main/jvm/ScalaMain.scala

object ScalaMain extends App {

  val testJavaRecord = new TestJavaRecord(5)

  val testScalaClass = new TestScalaClass(5, testJavaRecord)

  val testJavaClass = new TestJavaClass(5, testScalaClass)

  println(testJavaRecord.i)

  println(testScalaClass.testJavaRecord.i)

  println(testJavaClass.testScalaClass.testJavaRecord.i)

}

main/jvm/JavaMain.java

public class JavaMain {

    public static void main(String[] args) {
        TestJavaRecord testJavaRecord = new TestJavaRecord(5);

        TestScalaClass testScalaClass = new TestScalaClass(5, testJavaRecord);

        TestJavaClass testJavaClass = new TestJavaClass(5, testScalaClass);

        System.out.println(testJavaRecord.i());

        System.out.println(testScalaClass.testJavaRecord().i());

        System.out.println(testJavaClass.testScalaClass.testJavaRecord().i());
    }
}

【讨论】:

  • 如果java代码也依赖于scala代码怎么办?我应该如何配置 sourceSets?
  • 那么这是一个棘手的情况。 github.com/scala/scala/pull/9551 中添加了对 Java 16 record 的支持,但我认为任何发行版本都还没有包含此功能。
  • 是的,这正是我的情况,看起来还没有解决方法,这很可悲。无论如何,非常感谢您的帮助和时间!
  • @Zogger 针对 Scala 和 Java 代码相互依赖的情况进行了编辑。唯一的例外是records 都不能依赖任何 Scala 代码。
  • 这很棘手,我已经在 src/main/scala 中有所有 scala 代码,在 src/main/java 中有 java。当我将 java srcSets 定义为 src/main/java 并将 scala srcSets 定义为 src/main/scala 时,gradle compileJava 编译失败,因为编译器没有找到 scala 类的来源......我真的不知道出了什么问题
猜你喜欢
  • 2016-06-21
  • 2015-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多