WindowsでGraalVMを動かす。
Quarkus を触ってみようと思ってGet StartedをやってたらGraalVMが出てきたので実行してみました。 思ったよりも簡単にできましたが、Visual Studioの方でちょっとはまりどころがあったのでメモとして。
とりあえず、QuarkusのGet Startedのページについては終わった状態とします。 PowerShellが出てくるけど、特段何も困ることはありませんでした。
GraalVMをインストールする。
基本的には以下のページの通りです。
簡単に抜粋すると
①本家サイトからバイナリをダウンロード&解凍
②環境変数を追加
set GRAALVM_HOME=解凍した先のフォルダ set JAVA_HOME=${GRAALVM_HOME} set PATH=${GRAALVM_HOME}/bin;%PATH%
の2工程で終わりです。
Visual Studio 2022のインストール
Community Edition で大丈夫です。
C++のコンパイラが必要なので、C++によるデスクトップ開発を選択してインストールします。
GraalVMを実行する
Quarksのドキュメントだと
./mvnw package -Pnative
でビルドできるとなっていますが、Visual Studioを使用してコンパイルする場合は特殊な環境変数が必要になるので、それらが設定されたコマンドプロンプトを使用する必要があります。 スタートメニューから環境にあったコマンドプロンプトを指定して実行してください。
これで大丈夫なはずです。
必要に応じて、
gu install native-image
も実行してあげてください。(必要な場合はエラーメッセージに表示されてるはず)
成功したら targetの下に実行バイナリが出来ているはず。
ちなみに、環境変数が足りないと以下のようなエラーになります。スタートメニューから環境にあったコマンドプロンプトを指定して実行してください。
Error: Default native-compiler executable 'cl.exe' not found via environment variable PATH Error: To prevent native-toolchain checking provide command-line option -H:-CheckToolchain com.oracle.svm.core.util.UserError$UserException: Default native-compiler executable 'cl.exe' not found via environment variable PATH To prevent native-toolchain checking provide command-line option -H:-CheckToolchain at com.oracle.svm.core.util.UserError.abort(UserError.java:144) at com.oracle.svm.hosted.c.codegen.CCompilerInvoker.addSkipCheckingInfo(CCompilerInvoker.java:104) at com.oracle.svm.hosted.c.codegen.CCompilerInvoker.<init>(CCompilerInvoker.java:72) at com.oracle.svm.hosted.c.codegen.CCompilerInvoker$WindowsCCompilerInvoker.<init>(CCompilerInvoker.java:110) at com.oracle.svm.hosted.c.codegen.CCompilerInvoker.create(CCompilerInvoker.java:84) at com.oracle.svm.hosted.NativeImageGenerator.setupNativeImage(NativeImageGenerator.java:864) at com.oracle.svm.hosted.NativeImageGenerator.doRun(NativeImageGenerator.java:527) at com.oracle.svm.hosted.NativeImageGenerator.run(NativeImageGenerator.java:488) at com.oracle.svm.hosted.NativeImageGeneratorRunner.buildImage(NativeImageGeneratorRunner.java:403) at com.oracle.svm.hosted.NativeImageGeneratorRunner.build(NativeImageGeneratorRunner.java:569) at com.oracle.svm.hosted.NativeImageGeneratorRunner.main(NativeImageGeneratorRunner.java:122) at com.oracle.svm.hosted.NativeImageGeneratorRunner$JDK9Plus.main(NativeImageGeneratorRunner.java:599)
cl.exeが見つからないといって、適当にPATHを追加すると以下のようなエラーになります。スタートメニューから環境にあったコマンドプロンプトを指定して実行してください。
Error: Error compiling query code (in C:\Users\ユーザー名\AppData\Local\Temp\SVM-15902845214491549260\JNIHeaderDirectives.c). Compiler command ''C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.30.30705\bin\Hostx64\x64\cl.exe' /WX /W4 /wd4244 /wd4245 /wd4800 /wd4804 /wd4214 '-IC:\apps\graalvm-ce-java11-21.3.0\include\win32' '/FeC:\Users\ユーザー名\AppData\Local\Temp\SVM-15902845214491549260\JNIHeaderDirectives.exe' 'C:\Users\ユーザー名\AppData\Local\Temp\SVM-15902845214491549260\JNIHeaderDirectives.c'' output included error: [JNIHeaderDirectives.c, C:\Users\ユーザー名\AppData\Local\Temp\SVM-15902845214491549260\JNIHeaderDirectives.c(1): fatal error C1083: include ?t?@?C?????J???????B'stdio.h':No such file or directory] com.oracle.svm.core.util.UserError$UserException: Error compiling query code (in C:\Users\ユーザー名\AppData\Local\Temp\SVM-15902845214491549260\JNIHeaderDirectives.c). Compiler command ''C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.30.30705\bin\Hostx64\x64\cl.exe' /WX /W4 /wd4244 /wd4245 /wd4800 /wd4804 /wd4214 '-IC:\apps\graalvm-ce-java11-21.3.0\include\win32' '/FeC:\Users\ユーザー名\AppData\Local\Temp\SVM-15902845214491549260\JNIHeaderDirectives.exe' 'C:\Users\ユーザー名\AppData\Local\Temp\SVM-15902845214491549260\JNIHeaderDirectives.c'' output included error: [JNIHeaderDirectives.c, C:\Users\ユーザー名\AppData\Local\Temp\SVM-15902845214491549260\JNIHeaderDirectives.c(1): fatal error C1083: include ?t?@?C?????J???????B'stdio.h':No such file or directory] at com.oracle.svm.core.util.UserError.abort(UserError.java:144) at com.oracle.svm.hosted.c.NativeLibraries.reportErrors(NativeLibraries.java:370) at com.oracle.svm.hosted.NativeImageGenerator.processNativeLibraryImports(NativeImageGenerator.java:1571) at com.oracle.svm.hosted.NativeImageGenerator.setupNativeLibraries(NativeImageGenerator.java:1046) at com.oracle.svm.hosted.NativeImageGenerator.setupNativeImage(NativeImageGenerator.java:869) at com.oracle.svm.hosted.NativeImageGenerator.doRun(NativeImageGenerator.java:527) at com.oracle.svm.hosted.NativeImageGenerator.run(NativeImageGenerator.java:488) at com.oracle.svm.hosted.NativeImageGeneratorRunner.buildImage(NativeImageGeneratorRunner.java:403) at com.oracle.svm.hosted.NativeImageGeneratorRunner.build(NativeImageGeneratorRunner.java:569) at com.oracle.svm.hosted.NativeImageGeneratorRunner.main(NativeImageGeneratorRunner.java:122) at com.oracle.svm.hosted.NativeImageGeneratorRunner$JDK9Plus.main(NativeImageGeneratorRunner.java:599)