Mac で(Mac じゃなくても)Embulk を動かそうとして Java のバージョンにより動かなかった話

※ 2018年10月に書かれた記事です

はじめに

ごくごく当たり前のことしか書いていません。

結論

Embulk は、Java 9 以降では動かない。

では Mac ではどうするか

Oracle のページから Java 8 を落として入れます。

インストール後にバージョンを確認するとこんな感じになります。

$ java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

だめな場合

Java 9 以降を入れた場合はこんな感じになって怒られます。ドキュメントにあるサンプルコマンドを実行した場合の結果です。

$ java -version
java version "11" 2018-09-25
Java(TM) SE Runtime Environment 18.9 (build 11+28)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11+28, mixed mode)
$ embulk guess ./try1/seed.yml -o config.yml
OpenJDK 64-Bit Server VM warning: Option AggressiveOpts was deprecated in version 11.0 and will likely be removed in a future release.
2018-10-06 16:40:44.710 +0900: Embulk v0.9.7
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.google.inject.internal.cglib.core.$ReflectUtils$2 (file:/Users/FOOBAR/.embulk/bin/embulk) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of com.google.inject.internal.cglib.core.$ReflectUtils$2
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Exception in thread "main" java.lang.NoClassDefFoundError: javax/annotation/PostConstruct
    at org.embulk.guice.LifeCycleMethods.addLifeCycleMethods(LifeCycleMethods.java:65)
    at org.embulk.guice.LifeCycleMethods.<init>(LifeCycleMethods.java:39)
    at org.embulk.guice.LifeCycleMethodsMap.get(LifeCycleMethodsMap.java:33)
    at org.embulk.guice.LifeCycleModule.isLifeCycleClass(LifeCycleModule.java:105)
    at org.embulk.guice.LifeCycleModule.access$000(LifeCycleModule.java:41)
    at org.embulk.guice.LifeCycleModule$1$1.afterInjection(LifeCycleModule.java:73)
    at com.google.inject.internal.MembersInjectorImpl.notifyListeners(MembersInjectorImpl.java:119)
    at com.google.inject.internal.MembersInjectorImpl.injectAndNotify(MembersInjectorImpl.java:111)
    at com.google.inject.internal.Initializer$InjectableReference.get(Initializer.java:174)
    at com.google.inject.internal.Initializer.injectAll(Initializer.java:108)
    at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:174)
    at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:110)
    at com.google.inject.Guice.createInjector(Guice.java:96)
    at org.embulk.guice.Bootstrap.start(Bootstrap.java:143)
    at org.embulk.guice.Bootstrap.build(Bootstrap.java:110)
    at org.embulk.guice.Bootstrap.initialize(Bootstrap.java:100)
    at org.embulk.EmbulkEmbed$Bootstrap.build(EmbulkEmbed.java:98)
    at org.embulk.EmbulkEmbed$Bootstrap.initialize(EmbulkEmbed.java:78)
    at org.embulk.EmbulkSetup.setup(EmbulkSetup.java:32)
    at org.embulk.cli.EmbulkRun.runSubcommand(EmbulkRun.java:418)
    at org.embulk.cli.EmbulkRun.run(EmbulkRun.java:91)
    at org.embulk.cli.Main.main(Main.java:26)
Caused by: java.lang.ClassNotFoundException: javax.annotation.PostConstruct
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 22 more

つまり

公式ドキュメントにこのことはちゃんと書いてあり、公式ドキュメントを穴が開くまでまずは読めということ、これに尽きます。

備考

Java には全く詳しくないのですが、このようなことがあり得るのでバージョンを切り替えられる XXenv みたいなものがあるんですかね、って調べたら jenv がありました。

Powered by はてなブログ