この手順でできること
- Graal + Kotlin + Gradle 環境で JavaScript のコードを eval する
Graal導入
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!
-
無料で使いたい場合は、ローカル環境での開発 は Mac では EE を使ってよくて、 Production 環境だとサポートなしで CE を使ってねということでしょうか…。 ↩︎