ハッキングバカ

プログラミングに関するメモ

Luminus の本番環境でエラーが生じる[Clojure]

環境: macOS 10.14.3 Ubuntu 18.04

*追記有り

Luminus ではローカルで作成したものを

$ lein uberjar

で jar ファイルにして本番サーバに送って起動しているが、開発時に上手く動いていたものが突然本番サーバで起動できなくなった。

hackbaka@ip-111-111-111-111:~/deploy$ sudo java -jar exam.jar
clojure.lang.LispReader$ReaderException: java.lang.RuntimeException: Reader tag must be a symbol
	at clojure.lang.LispReader.read(LispReader.java:292)
	at clojure.lang.LispReader.read(LispReader.java:196)
	at clojure.lang.LispReader.read(LispReader.java:185)
	at clojure.core$read.invokeStatic(core.clj:3666)
	at clojure.core$load_data_reader_file.invokeStatic(core.clj:7485)
	at clojure.core$load_data_reader_file.invoke(core.clj:7480)
	at clojure.core.protocols$fn__6755.invokeStatic(protocols.clj:167)
	at clojure.core.protocols$fn__6755.invoke(protocols.clj:124)
	at clojure.core.protocols$fn__6710$G__6705__6719.invoke(protocols.clj:19)
	at clojure.core.protocols$seq_reduce.invokeStatic(protocols.clj:31)
	at clojure.core.protocols$fn__6738.invokeStatic(protocols.clj:75)
	at clojure.core.protocols$fn__6738.invoke(protocols.clj:75)
	at clojure.core.protocols$fn__6684$G__6679__6697.invoke(protocols.clj:13)
	at clojure.core$reduce.invokeStatic(core.clj:6545)
	at clojure.core$load_data_readers$fn__7291.invoke(core.clj:7511)
	at clojure.lang.AFn.applyToHelper(AFn.java:154)
	at clojure.lang.AFn.applyTo(AFn.java:144)
	at clojure.lang.Var.alterRoot(Var.java:303)
	at clojure.core$alter_var_root.invokeStatic(core.clj:5299)
	at clojure.core$alter_var_root.doInvoke(core.clj:5294)
	at clojure.lang.RestFn.invoke(RestFn.java:425)
	at clojure.core$load_data_readers.invokeStatic(core.clj:7510)
	at clojure.core$fn__7294.invokeStatic(core.clj:7515)
	at clojure.core$fn__7294.invoke(core.clj:7515)
	at clojure.core__init.load(Unknown Source)
	at clojure.core__init.<clinit>(Unknown Source)
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:374)
	at clojure.lang.RT.classForName(RT.java:2168)
	at clojure.lang.RT.classForName(RT.java:2177)
	at clojure.lang.RT.loadClassForName(RT.java:2196)
	at clojure.lang.RT.load(RT.java:443)
	at clojure.lang.RT.load(RT.java:419)
	at clojure.lang.RT.doInit(RT.java:461)
	at clojure.lang.RT.<clinit>(RT.java:331)
	at clojure.lang.Namespace.<init>(Namespace.java:34)
	at clojure.lang.Namespace.findOrCreate(Namespace.java:176)
	at clojure.lang.Var.internPrivate(Var.java:151)
	at exam.core.<clinit>(Unknown Source)
Caused by: java.lang.RuntimeException: Reader tag must be a symbol
	at clojure.lang.LispReader$CtorReader.invoke(LispReader.java:1221)
	at clojure.lang.LispReader$DispatchReader.invoke(LispReader.java:684)
	at clojure.lang.LispReader.read(LispReader.java:263)
	... 38 more
Exception in thread "main" java.lang.ExceptionInInitializerError
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:374)
	at clojure.lang.RT.classForName(RT.java:2168)
	at clojure.lang.RT.classForName(RT.java:2177)
	at clojure.lang.RT.loadClassForName(RT.java:2196)
	at clojure.lang.RT.load(RT.java:443)
	at clojure.lang.RT.load(RT.java:419)
	at clojure.lang.RT.doInit(RT.java:461)
	at clojure.lang.RT.<clinit>(RT.java:331)
	at clojure.lang.Namespace.<init>(Namespace.java:34)
	at clojure.lang.Namespace.findOrCreate(Namespace.java:176)
	at clojure.lang.Var.internPrivate(Var.java:151)
	at exam.core.<clinit>(Unknown Source)
Caused by: clojure.lang.LispReader$ReaderException: java.lang.RuntimeException: Reader tag must be a symbol
	at clojure.lang.LispReader.read(LispReader.java:292)
	at clojure.lang.LispReader.read(LispReader.java:196)
	at clojure.lang.LispReader.read(LispReader.java:185)
	at clojure.core$read.invokeStatic(core.clj:3666)
	at clojure.core$load_data_reader_file.invokeStatic(core.clj:7485)
	at clojure.core$load_data_reader_file.invoke(core.clj:7480)
	at clojure.core.protocols$fn__6755.invokeStatic(protocols.clj:167)
	at clojure.core.protocols$fn__6755.invoke(protocols.clj:124)
	at clojure.core.protocols$fn__6710$G__6705__6719.invoke(protocols.clj:19)
	at clojure.core.protocols$seq_reduce.invokeStatic(protocols.clj:31)
	at clojure.core.protocols$fn__6738.invokeStatic(protocols.clj:75)
	at clojure.core.protocols$fn__6738.invoke(protocols.clj:75)
	at clojure.core.protocols$fn__6684$G__6679__6697.invoke(protocols.clj:13)
	at clojure.core$reduce.invokeStatic(core.clj:6545)
	at clojure.core$load_data_readers$fn__7291.invoke(core.clj:7511)
	at clojure.lang.AFn.applyToHelper(AFn.java:154)
	at clojure.lang.AFn.applyTo(AFn.java:144)
	at clojure.lang.Var.alterRoot(Var.java:303)
	at clojure.core$alter_var_root.invokeStatic(core.clj:5299)
	at clojure.core$alter_var_root.doInvoke(core.clj:5294)
	at clojure.lang.RestFn.invoke(RestFn.java:425)
	at clojure.core$load_data_readers.invokeStatic(core.clj:7510)
	at clojure.core$fn__7294.invokeStatic(core.clj:7515)
	at clojure.core$fn__7294.invoke(core.clj:7515)
	at clojure.core__init.load(Unknown Source)
	at clojure.core__init.<clinit>(Unknown Source)
	... 13 more
Caused by: java.lang.RuntimeException: Reader tag must be a symbol
	at clojure.lang.LispReader$CtorReader.invoke(LispReader.java:1221)
	at clojure.lang.LispReader$DispatchReader.invoke(LispReader.java:684)
	at clojure.lang.LispReader.read(LispReader.java:263)
	... 38 more

エラーに自前のコードが全く含まれていないので、どこがおかしいのか全く分からなかった。
しかしどうやら leiningen 2.9.0 で jar ファイルを作成するときにこのようなエラーが起こることがあるらしい。
何気なく brew upgrade を行ってしまったのが直接の原因だった。
参考: Leiningen creates non-backwards compatible data_readers.clj · Issue #2530 · technomancy/leiningen · GitHub
バージョンを leiningen 2.8.3 に戻して uberjar を行うと無事動いた。
macOS の手順は

$ cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula

コミットログを見て一つ前のバージョンを探す。

$ git log leiningen.rb
$ git checkout fd1c0ba8f162a3c41debef6143dca8ba19227f90 leiningen.rb

最新バージョンはあるとやっかいなのでアンインストール。

$ brew uninstall leiningen
$ brew install leiningen

確認。

$ lein --version
Leiningen 2.8.3 on Java 1.8.0_112 Java HotSpot(TM) 64-Bit Server VM

アップデートは気をつけるべきだという教訓。
Clojure のエラーメッセージはもっと分かりやすくならないだろうか。

参考: [2018/10]homebrewで過去バージョンのパッケージをインストールする - Qiita


---------------追記---------------

このエラーは Clojure のバージョンが 1.8.0 以下だと生じるようで、1.9.0 以上にアップデートすると起こらなくなる。
dependencies を書き換えバージョンアップする。

; project.clj

[org.clojure/clojure "1.10.0"]

これで leiningen 2.9.0 でも動くようになった。
参考: