Graal + Kotlin + Gradle で JavaScript を動かす

Jul 25, 2018

この手順でできること

  • Graal + Kotlin + Gradle 環境で JavaScript のコードを eval する

Graal導入

Getting started with GraalVM

Downloads からダウンロードします。

Mac だと EE 版しか利用できません。1

環境設定

普段使っているJava環境、Node環境もあるので専用のディレクトリを用意し、そこの配下に graal.sh というシェルスクリプトを用意しました。 手動で source コマンドで実行して必要な環境変数を export します。

# graal.sh

################################################################################
# Graal
################################################################################
export GRAAL_HOME=/Library/Graal/Contents/Home
export PATH=$GRAAL_HOME/bin/:$PATH
export JAVA_HOME=$GRAAL_HOME
$ source graal.sh

KotlinでHelloWorld

Gradle設定

java -jar でコマンドライン実行して標準出力に文字列を出力したいので、jar 設定に Main-Class 設定を書いています。

また、 dependencies には graal-sdk を追加しています。

ここのHelloWorldの例だと Java のコードではそのまま org.graalvm... パッケージのクラスを使えるのですが、 私のKotlin環境だと使えなかったので SDK を追加しています。

HelloPolyglot.kt:1:12: error: unresolved reference: graalvm
import org.graalvm.polyglot.*;
           ^

参考: Build steps for embedding graalvm · Issue #550 · oracle/graal

group 'com.github.mookjp'
version '1.0.0-SNAPSHOT'

apply plugin: "java"
apply plugin: "kotlin"
apply plugin: "idea"

buildscript {
    ext.kotlin_version = '1.2.51'
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

sourceSets {
    main.java.srcDirs += 'src/main/kotlin/'
    test.java.srcDirs += 'src/test/kotlin/'
}

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    compile 'org.graalvm:graal-sdk:1.0.0-rc4'
    testCompile "junit:junit:4.12"
}

jar {
    manifest {
        attributes 'Main-Class': 'com.github.mookjp.gp.MainKt'
    }

    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}

Kotlin Main関数

org.graalvm.polyglot パッケージ以下の Content を利用します。

package com.github.mookjp.gp

import org.graalvm.polyglot.*;

fun main(args: Array<String>) {
    println("hello")
    val context = Context.create()
    context.eval("js", "print('Hello JavaScript!');")
}

コンパイルして動かす

$ ./gradlew build
$ java -jar ./build/libs/graal-playground-1.0.0-SNAPSHOT.jar

hello
Hello JavaScript!

  1. 無料で使いたい場合は、ローカル環境での開発 は Mac では EE を使ってよくて、 Production 環境だとサポートなしで CE を使ってねということでしょうか…。 [return]
Retrun to top