如何在现有的 SBT scala 项目中互操作 kotlin 代码

Avn*_*arr 6 scala intellij-idea gradle sbt kotlin

我有一个现有的scala项目,SBT其中有几个模块。\n我想开始添加新模块kotlin- 我不需要添加到kotlin现有模块的能力(但如果可能的话会很好)\n我可以创建新的专用模块新kotlin代码的模块,如果这是必要的,只要现有scala代码可以调用新添加的kotlin模块(反之亦然,有它就好,但如果不可能的话,没有“kotlin 调用 scala”也可以生存) )

\n

这件事可行、可行吗?如果可以的话,这将如何完成?

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 build.sbt\n............\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Module1ScalaWithJava (EXISTING)\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 java\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 resources\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 scala\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Module2ScalaOnly (EXISTING)\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 scala\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 scala\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 NewModuleKotlinOnly (I WANT THIS)\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ???KOTLIN????\n
Run Code Online (Sandbox Code Playgroud)\n

Bor*_*nov 11

正如评论中提到的,您可以使用kotlin-plugin添加 kotlin 模块。

将行添加到您的project/plugins.sbt文件(或创建它):

addSbtPlugin("com.hanhuy.sbt" % "kotlin-plugin" % "2.0.0")

您将能够kotlin向您的 sbt 项目添加模块。我建议您仅使用build.sbt文件来添加模块。下面我将向您演示如何做到这一点。

我创建了简单的多模块项目,其中scalakotlin模块相互依赖。

这是我的build.sbt

name := "kotlin-scala"

version := "0.1"

scalaVersion := "2.13.4"

lazy val scalaFirst =
  project
    .in(file("scala-first"))

lazy val kotlinFirst =
  project
    .in(file("kotlin-first"))
    .settings(
      libraryDependencies ++= Seq(
        "org.junit.jupiter" % "junit-jupiter-api" % "5.7.0"
      ).map(_ % Test)
    )

lazy val scalaSecond =
  project
    .in(file("scala-second"))
    .dependsOn(kotlinFirst % "compile->compile;test->test")
    .settings(
      libraryDependencies ++= Seq(
        "org.scalatest" %% "scalatest" % "3.2.3"
      ).map(_ % Test)
    )

lazy val kotlinSecond =
  project
    .in(file("kotlin-second"))
    .dependsOn(scalaFirst % "compile->compile;test->test")
    .settings(
      libraryDependencies ++= Seq(
        "org.junit.jupiter" % "junit-jupiter-api" % "5.7.0"
      ).map(_ % Test)
    )

lazy val kotlinScalaSubmodule =
  project
    .in(file("kotlin-scala-submodule"))
    .dependsOn(kotlinFirst % "compile->compile;test->test")
    .dependsOn(scalaFirst % "compile->compile;test->test")
    .settings(
      libraryDependencies ++= Seq(
        "org.junit.jupiter" % "junit-jupiter-api" % "5.7.0"
      ).map(_ % Test)
    )

lazy val scalaKotlinSubmodule =
  project
    .in(file("scala-kotlin-submodule"))
    .dependsOn(scalaFirst % "compile->compile;test->test")
    .dependsOn(kotlinFirst % "compile->compile;test->test")
    .settings(
      libraryDependencies ++= Seq(
        "org.scalatest" %% "scalatest" % "3.2.3"
      ).map(_ % Test)
    )
Run Code Online (Sandbox Code Playgroud)

build.properties包含:

sbt.version = 1.3.2
Run Code Online (Sandbox Code Playgroud)

我的项目结构:

项目结构

这里我有一些模块之间的依赖关系:

     +---------------+    +--------------+
     |  kotlin-first |    |  scala-first |
     +---------------+    +--------------+
             ^        \  /       ^ 
             |         \/        | 
      +--------------+ || +---------------+
      | scala-second | || | kotlin-second |
      +--------------+ || +---------------+
                       ||
                      /  \
  +------------------+    +------------------+
  | scala-kotlin-sub |    | kotlin-scala-sub |
  +------------------+    +------------------+
Run Code Online (Sandbox Code Playgroud)

完整的项目你可以在github上找到

我还编写了一些单元测试来证明它可以正常工作。测试于:

  • java open-jdk 1.8 ,
  • scala版本2.13.4
  • sbt版本 1.3.2
  • 带有jetBrains scala 插件的Intellij IDEA bu​​ild 2020.2.3可以在该项目中正常工作。