※ 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 がありました。