ScalaとKotlinとJavaのソースを一緒にビルドする

今回やったことはタイトルでほぼ説明されているのですが、それだと味気ないので説明してみます。

まず、Scalaのビルドツールであるsbtでは、Scalaプログラムだけでなく、Javaプログラムも混ぜてコンパイルすることができるのですが、それに加えて、 kotlin-plugin 1 を使えば、Kotlinのプログラムもビルドすることができるようになります。今回は、このプラグインを使って、ScalaとKotlinとJavaのプログラムを混ぜてビルドしてみました。

構成は簡単で、 ScalaClass extends JavaClass extends KotlinClass という継承順になるように並べただけです。順番にソースコードを貼っていきます。

package com.github.kmizu.scala_kotlin_java

open class KotlinClass(open val name: String)

fun main(args: Array<String>) {
    println(KotlinClass("Kotlin").name)
}

KotlinClass というクラスを定義して、 main では name を出力しています。次にJavaのソースですが、次のようになります:

package com.github.kmizu.scala_kotlin_java;

public class JavaClass extends KotlinClass {
    public JavaClass(String name) {
        super(name);
    }

    public static void main(String[] args) {
        System.out.println(new JavaClass("Java").getName());
    }
}

getName() という定義した覚えの無いメソッドが生えていますが、これは、Kotlinのプロパティが、JavaからはJavaBeans形式のgetterとして見えるためにそうなっています。

最後に、Scalaのソースです。

package com.github.kmizu.scala_kotlin_java

object ScalaFile {
  class ScalaClass(val name: String) extends KotlinClass(name)

  def main(args: Array[String]): Unit = {
    println(new ScalaClass("Scala").name)
  }
}

同様に、 KotlinClass を継承しています。 ScalaClass のコンストラクタ引数には val を付けて name を定義してあるので(Kotlinのプロパティと同じ)、 name で参照することができます。

各言語のソースコードは、それぞれ、

  • src/main/kotlin/com/github/kmizu/scala_kotlin_java
  • src/main/java/com/github/kmizu/scala_kotlin_java
  • src/main/scala/com/github/kmizu/scala_kotlin_java

に置かれており、各言語の標準的なディレクトリレイアウトにしたがっています。なお、IntelliJ IDEAにビルド定義( build.sbt )を食わせたとき、ちゃんとどの言語のソースコードでも補完が効いていました。素晴らしいですね。

ソースコードは、

https://github.com/kmizu/scala-kotlin-java

に公開しているので、暇だったら覗いてみてください。ちなみに、sbtはこのように複数言語を混在したプロジェクトをビルドすることができますが、単一の言語のビルドツールとして使えます。まあ、主にScalaのために使われるのですが、稀にJavaのビルドツールとしてsbtを使っているのを見かけます。

それでは、また。


  1. @xuwei_k さんに教えていただきました 

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.