在 Android 上使用苹果酒
Using Cider on Android
我正尝试在 Android 上关注 this tutorial 基于 lein-droid
的 Clojure 开发。但是,本教程跳过了对 Cider 支持的设置。
我通过添加
从默认 lein-droid
项目开始
:user {:plugins [ [lein-droid "0.4.0-alpha4"] ]}
到我的~/.lein/profiles.clj
,然后运行
$ lein droid new android-hello com.example.android_hello
根据教程,我应该可以做一个lein droid doall
,然后用Cider连接到localhost:9999
;但是,由于 Android 端缺少 nREPL,它无法使用:
; CIDER 0.9.1 (Java 0, Clojure 1.7.0-beta3-r2, nREPL nil)
WARNING: CIDER's version (0.9.1) does not match cider-nrepl's version (not installed)
那么,根据我发现的 this other tutorial,我应该将 cider-nrepl
添加到我的 Android 依赖项,方法是将其添加到 ~/.lein/profiles.clj
:
:android-user {:plugins [[cider/cider-nrepl "0.9.1"]]
:android {:aot-exclude-ns ["cider.nrepl.middleware.util.java.parser"
"cider.nrepl" "cider-nrepl.plugin"]}}}
所以我做了一个新的 lein clean; lein droid doall
以确保一切都被很好地拾取;现在生成的程序在 Android 启动时崩溃:
W/dalvikvm( 2508): Exception Ljava/lang/IllegalArgumentException; thrown while initializing Ldeps/cljfmt/v0v1v10/cljfmt/core__init;
W/dalvikvm( 2508): Exception Ljava/lang/ExceptionInInitializerError; thrown while initializing Lcider/nrepl/middleware/format__init;
W/dalvikvm( 2508): threadid=10: thread exiting with uncaught exception (group=0xb5157180)
E/AndroidRuntime( 2508): FATAL EXCEPTION: ClojureLoadingThread
E/AndroidRuntime( 2508): java.lang.ExceptionInInitializerError
E/AndroidRuntime( 2508): at java.lang.Class.classForName(Native Method)
E/AndroidRuntime( 2508): at java.lang.Class.forName(Class.java:217)
E/AndroidRuntime( 2508): at clojure.lang.RT.classForName(RT.java:2201)
E/AndroidRuntime( 2508): at clojure.lang.RT.classForName(RT.java:2210)
E/AndroidRuntime( 2508): at clojure.lang.RT.loadClassForName(RT.java:2229)
E/AndroidRuntime( 2508): at clojure.lang.RT.load(RT.java:461)
E/AndroidRuntime( 2508): at clojure.lang.RT.load(RT.java:437)
E/AndroidRuntime( 2508): at clojure.core$load$fn__5442.invoke(core.clj:5858)
E/AndroidRuntime( 2508): at clojure.core$load.doInvoke(core.clj:5857)
E/AndroidRuntime( 2508): at clojure.lang.RestFn.invoke(RestFn.java:408)
E/AndroidRuntime( 2508): at clojure.core$load_one.invoke(core.clj:5663)
E/AndroidRuntime( 2508): at clojure.core$load_lib$fn__5391.invoke(core.clj:5703)
E/AndroidRuntime( 2508): at clojure.core$load_lib.doInvoke(core.clj:5702)
E/AndroidRuntime( 2508): at clojure.lang.RestFn.applyTo(RestFn.java:142)
E/AndroidRuntime( 2508): at clojure.core$apply.invoke(core.clj:630)
E/AndroidRuntime( 2508): at clojure.core$load_libs.doInvoke(core.clj:5741)
E/AndroidRuntime( 2508): at clojure.lang.RestFn.applyTo(RestFn.java:137)
E/AndroidRuntime( 2508): at clojure.core$apply.invoke(core.clj:630)
E/AndroidRuntime( 2508): at clojure.core$require.doInvoke(core.clj:5824)
E/AndroidRuntime( 2508): at clojure.lang.RestFn.invoke(RestFn.java:408)
E/AndroidRuntime( 2508): at neko.tools.repl$start_repl$fn__6556$fn__6557.invoke(repl.clj:77)
E/AndroidRuntime( 2508): at clojure.core$map$fn__4547.invoke(core.clj:2616)
E/AndroidRuntime( 2508): at clojure.lang.LazySeq.sval(LazySeq.java:40)
E/AndroidRuntime( 2508): at clojure.lang.LazySeq.seq(LazySeq.java:49)
E/AndroidRuntime( 2508): at clojure.lang.RT.seq(RT.java:534)
E/AndroidRuntime( 2508): at clojure.core$seq__4122.invoke(core.clj:135)
E/AndroidRuntime( 2508): at clojure.core$apply.invoke(core.clj:628)
E/AndroidRuntime( 2508): at neko.tools.repl$start_repl$fn__6556.invoke(repl.clj:75)
E/AndroidRuntime( 2508): at clojure.core$with_redefs_fn.invoke(core.clj:7185)
E/AndroidRuntime( 2508): at neko.tools.repl$start_repl.doInvoke(repl.clj:72)
E/AndroidRuntime( 2508): at clojure.lang.RestFn.applyTo(RestFn.java:139)
E/AndroidRuntime( 2508): at clojure.core$apply.invoke(core.clj:630)
E/AndroidRuntime( 2508): at neko.tools.repl$init.doInvoke(repl.clj:102)
E/AndroidRuntime( 2508): at clojure.lang.RestFn.invoke(RestFn.java:397)
E/AndroidRuntime( 2508): at clojure.lang.Var.invoke(Var.java:375)
E/AndroidRuntime( 2508): at neko.App.loadClojure(App.java:40)
E/AndroidRuntime( 2508): at neko.App.run(App.java:51)
E/AndroidRuntime( 2508): at java.lang.Thread.run(Thread.java:856)
E/AndroidRuntime( 2508): Caused by: java.lang.ExceptionInInitializerError
E/AndroidRuntime( 2508): at java.lang.Class.classForName(Native Method)
E/AndroidRuntime( 2508): at java.lang.Class.forName(Class.java:217)
E/AndroidRuntime( 2508): at clojure.lang.RT.classForName(RT.java:2201)
E/AndroidRuntime( 2508): at clojure.lang.RT.classForName(RT.java:2210)
E/AndroidRuntime( 2508): at clojure.lang.RT.loadClassForName(RT.java:2229)
E/AndroidRuntime( 2508): at clojure.lang.RT.load(RT.java:461)
E/AndroidRuntime( 2508): at clojure.lang.RT.load(RT.java:437)
E/AndroidRuntime( 2508): at clojure.core$load$fn__5442.invoke(core.clj:5858)
E/AndroidRuntime( 2508): at clojure.core$load.doInvoke(core.clj:5857)
E/AndroidRuntime( 2508): at clojure.lang.RestFn.invoke(RestFn.java:408)
E/AndroidRuntime( 2508): at clojure.core$load_one.invoke(core.clj:5663)
E/AndroidRuntime( 2508): at clojure.core$load_lib$fn__5391.invoke(core.clj:5703)
E/AndroidRuntime( 2508): at clojure.core$load_lib.doInvoke(core.clj:5702)
E/AndroidRuntime( 2508): at clojure.lang.RestFn.applyTo(RestFn.java:142)
E/AndroidRuntime( 2508): at clojure.core$apply.invoke(core.clj:630)
E/AndroidRuntime( 2508): at clojure.core$load_libs.doInvoke(core.clj:5741)
E/AndroidRuntime( 2508): at clojure.lang.RestFn.applyTo(RestFn.java:137)
E/AndroidRuntime( 2508): at clojure.core$apply.invoke(core.clj:630)
E/AndroidRuntime( 2508): at clojure.core$require.doInvoke(core.clj:5824)
E/AndroidRuntime( 2508): at clojure.lang.RestFn.invoke(RestFn.java:703)
E/AndroidRuntime( 2508): at cider.nrepl.middleware.format$loading__5334__auto____6889.invoke(format.clj:1)
E/AndroidRuntime( 2508): at cider.nrepl.middleware.format__init.load(Unknown Source)
E/AndroidRuntime( 2508): at cider.nrepl.middleware.format__init.<clinit>(Unknown Source)
E/AndroidRuntime( 2508): ... 38 more
E/AndroidRuntime( 2508): Caused by: java.lang.IllegalArgumentException: No implementation of method: :make-reader of protocol: #'clojure.java.io/IOFactory found for class: nil
E/AndroidRuntime( 2508): at clojure.core$_cache_protocol_fn.invoke(core_deftype.clj:554)
E/AndroidRuntime( 2508): at clojure.java.io$fn__8970$G__8946__8977.invoke(io.clj:69)
E/AndroidRuntime( 2508): at clojure.java.io$reader.doInvoke(io.clj:102)
E/AndroidRuntime( 2508): at clojure.lang.RestFn.invoke(RestFn.java:410)
E/AndroidRuntime( 2508): at clojure.lang.AFn.applyToHelper(AFn.java:154)
E/AndroidRuntime( 2508): at clojure.lang.RestFn.applyTo(RestFn.java:132)
E/AndroidRuntime( 2508): at clojure.core$apply.invoke(core.clj:630)
E/AndroidRuntime( 2508): at clojure.core$slurp.doInvoke(core.clj:6645)
E/AndroidRuntime( 2508): at clojure.lang.RestFn.invoke(RestFn.java:410)
E/AndroidRuntime( 2508): at clojure.core$comp$fn__4489.invoke(core.clj:2432)
E/AndroidRuntime( 2508): at clojure.core$comp$fn__4489.invoke(core.clj:2432)
E/AndroidRuntime( 2508): at deps.cljfmt.v0v1v10.cljfmt.core__init.load(Unknown Source)
E/AndroidRuntime( 2508): at deps.cljfmt.v0v1v10.cljfmt.core__init.<clinit>(Unknown Source)
E/AndroidRuntime( 2508): ... 61 more
W/ActivityManager( 867): Force finishing activity hu.erdi.gergo.clojure_android_hello.debug/hu.erdi.gergo.clojure_android_hello.SplashActivity
W/WindowManager( 867): Failure taking screenshot for (180x300) to layer 21010
D/dalvikvm( 867): GC_CONCURRENT freed 561K, 13% free 11324K/12871K, paused 0ms+2ms
W/NetworkManagementSocketTagger( 867): setKernelCountSet(10041, 0) failed with errno -2
您在按照上面引用的教程进行操作时似乎犯了一个小错误。
这个:
:android-user {:plugins [[cider/cider-nrepl "0.9.1"]]
:android {:aot-exclude-ns ["cider.nrepl.middleware.util.java.parser"
"cider.nrepl" "cider-nrepl.plugin"]}}}
应该是:
:android-user {:dependencies [[cider/cider-nrepl "0.9.1"]]
:android {:aot-exclude-ns ["cider.nrepl.middleware.util.java.parser"
"cider.nrepl" "cider-nrepl.plugin"]}}
我正尝试在 Android 上关注 this tutorial 基于 lein-droid
的 Clojure 开发。但是,本教程跳过了对 Cider 支持的设置。
我通过添加
从默认lein-droid
项目开始
:user {:plugins [ [lein-droid "0.4.0-alpha4"] ]}
到我的~/.lein/profiles.clj
,然后运行
$ lein droid new android-hello com.example.android_hello
根据教程,我应该可以做一个lein droid doall
,然后用Cider连接到localhost:9999
;但是,由于 Android 端缺少 nREPL,它无法使用:
; CIDER 0.9.1 (Java 0, Clojure 1.7.0-beta3-r2, nREPL nil)
WARNING: CIDER's version (0.9.1) does not match cider-nrepl's version (not installed)
那么,根据我发现的 this other tutorial,我应该将 cider-nrepl
添加到我的 Android 依赖项,方法是将其添加到 ~/.lein/profiles.clj
:
:android-user {:plugins [[cider/cider-nrepl "0.9.1"]]
:android {:aot-exclude-ns ["cider.nrepl.middleware.util.java.parser"
"cider.nrepl" "cider-nrepl.plugin"]}}}
所以我做了一个新的 lein clean; lein droid doall
以确保一切都被很好地拾取;现在生成的程序在 Android 启动时崩溃:
W/dalvikvm( 2508): Exception Ljava/lang/IllegalArgumentException; thrown while initializing Ldeps/cljfmt/v0v1v10/cljfmt/core__init;
W/dalvikvm( 2508): Exception Ljava/lang/ExceptionInInitializerError; thrown while initializing Lcider/nrepl/middleware/format__init;
W/dalvikvm( 2508): threadid=10: thread exiting with uncaught exception (group=0xb5157180)
E/AndroidRuntime( 2508): FATAL EXCEPTION: ClojureLoadingThread
E/AndroidRuntime( 2508): java.lang.ExceptionInInitializerError
E/AndroidRuntime( 2508): at java.lang.Class.classForName(Native Method)
E/AndroidRuntime( 2508): at java.lang.Class.forName(Class.java:217)
E/AndroidRuntime( 2508): at clojure.lang.RT.classForName(RT.java:2201)
E/AndroidRuntime( 2508): at clojure.lang.RT.classForName(RT.java:2210)
E/AndroidRuntime( 2508): at clojure.lang.RT.loadClassForName(RT.java:2229)
E/AndroidRuntime( 2508): at clojure.lang.RT.load(RT.java:461)
E/AndroidRuntime( 2508): at clojure.lang.RT.load(RT.java:437)
E/AndroidRuntime( 2508): at clojure.core$load$fn__5442.invoke(core.clj:5858)
E/AndroidRuntime( 2508): at clojure.core$load.doInvoke(core.clj:5857)
E/AndroidRuntime( 2508): at clojure.lang.RestFn.invoke(RestFn.java:408)
E/AndroidRuntime( 2508): at clojure.core$load_one.invoke(core.clj:5663)
E/AndroidRuntime( 2508): at clojure.core$load_lib$fn__5391.invoke(core.clj:5703)
E/AndroidRuntime( 2508): at clojure.core$load_lib.doInvoke(core.clj:5702)
E/AndroidRuntime( 2508): at clojure.lang.RestFn.applyTo(RestFn.java:142)
E/AndroidRuntime( 2508): at clojure.core$apply.invoke(core.clj:630)
E/AndroidRuntime( 2508): at clojure.core$load_libs.doInvoke(core.clj:5741)
E/AndroidRuntime( 2508): at clojure.lang.RestFn.applyTo(RestFn.java:137)
E/AndroidRuntime( 2508): at clojure.core$apply.invoke(core.clj:630)
E/AndroidRuntime( 2508): at clojure.core$require.doInvoke(core.clj:5824)
E/AndroidRuntime( 2508): at clojure.lang.RestFn.invoke(RestFn.java:408)
E/AndroidRuntime( 2508): at neko.tools.repl$start_repl$fn__6556$fn__6557.invoke(repl.clj:77)
E/AndroidRuntime( 2508): at clojure.core$map$fn__4547.invoke(core.clj:2616)
E/AndroidRuntime( 2508): at clojure.lang.LazySeq.sval(LazySeq.java:40)
E/AndroidRuntime( 2508): at clojure.lang.LazySeq.seq(LazySeq.java:49)
E/AndroidRuntime( 2508): at clojure.lang.RT.seq(RT.java:534)
E/AndroidRuntime( 2508): at clojure.core$seq__4122.invoke(core.clj:135)
E/AndroidRuntime( 2508): at clojure.core$apply.invoke(core.clj:628)
E/AndroidRuntime( 2508): at neko.tools.repl$start_repl$fn__6556.invoke(repl.clj:75)
E/AndroidRuntime( 2508): at clojure.core$with_redefs_fn.invoke(core.clj:7185)
E/AndroidRuntime( 2508): at neko.tools.repl$start_repl.doInvoke(repl.clj:72)
E/AndroidRuntime( 2508): at clojure.lang.RestFn.applyTo(RestFn.java:139)
E/AndroidRuntime( 2508): at clojure.core$apply.invoke(core.clj:630)
E/AndroidRuntime( 2508): at neko.tools.repl$init.doInvoke(repl.clj:102)
E/AndroidRuntime( 2508): at clojure.lang.RestFn.invoke(RestFn.java:397)
E/AndroidRuntime( 2508): at clojure.lang.Var.invoke(Var.java:375)
E/AndroidRuntime( 2508): at neko.App.loadClojure(App.java:40)
E/AndroidRuntime( 2508): at neko.App.run(App.java:51)
E/AndroidRuntime( 2508): at java.lang.Thread.run(Thread.java:856)
E/AndroidRuntime( 2508): Caused by: java.lang.ExceptionInInitializerError
E/AndroidRuntime( 2508): at java.lang.Class.classForName(Native Method)
E/AndroidRuntime( 2508): at java.lang.Class.forName(Class.java:217)
E/AndroidRuntime( 2508): at clojure.lang.RT.classForName(RT.java:2201)
E/AndroidRuntime( 2508): at clojure.lang.RT.classForName(RT.java:2210)
E/AndroidRuntime( 2508): at clojure.lang.RT.loadClassForName(RT.java:2229)
E/AndroidRuntime( 2508): at clojure.lang.RT.load(RT.java:461)
E/AndroidRuntime( 2508): at clojure.lang.RT.load(RT.java:437)
E/AndroidRuntime( 2508): at clojure.core$load$fn__5442.invoke(core.clj:5858)
E/AndroidRuntime( 2508): at clojure.core$load.doInvoke(core.clj:5857)
E/AndroidRuntime( 2508): at clojure.lang.RestFn.invoke(RestFn.java:408)
E/AndroidRuntime( 2508): at clojure.core$load_one.invoke(core.clj:5663)
E/AndroidRuntime( 2508): at clojure.core$load_lib$fn__5391.invoke(core.clj:5703)
E/AndroidRuntime( 2508): at clojure.core$load_lib.doInvoke(core.clj:5702)
E/AndroidRuntime( 2508): at clojure.lang.RestFn.applyTo(RestFn.java:142)
E/AndroidRuntime( 2508): at clojure.core$apply.invoke(core.clj:630)
E/AndroidRuntime( 2508): at clojure.core$load_libs.doInvoke(core.clj:5741)
E/AndroidRuntime( 2508): at clojure.lang.RestFn.applyTo(RestFn.java:137)
E/AndroidRuntime( 2508): at clojure.core$apply.invoke(core.clj:630)
E/AndroidRuntime( 2508): at clojure.core$require.doInvoke(core.clj:5824)
E/AndroidRuntime( 2508): at clojure.lang.RestFn.invoke(RestFn.java:703)
E/AndroidRuntime( 2508): at cider.nrepl.middleware.format$loading__5334__auto____6889.invoke(format.clj:1)
E/AndroidRuntime( 2508): at cider.nrepl.middleware.format__init.load(Unknown Source)
E/AndroidRuntime( 2508): at cider.nrepl.middleware.format__init.<clinit>(Unknown Source)
E/AndroidRuntime( 2508): ... 38 more
E/AndroidRuntime( 2508): Caused by: java.lang.IllegalArgumentException: No implementation of method: :make-reader of protocol: #'clojure.java.io/IOFactory found for class: nil
E/AndroidRuntime( 2508): at clojure.core$_cache_protocol_fn.invoke(core_deftype.clj:554)
E/AndroidRuntime( 2508): at clojure.java.io$fn__8970$G__8946__8977.invoke(io.clj:69)
E/AndroidRuntime( 2508): at clojure.java.io$reader.doInvoke(io.clj:102)
E/AndroidRuntime( 2508): at clojure.lang.RestFn.invoke(RestFn.java:410)
E/AndroidRuntime( 2508): at clojure.lang.AFn.applyToHelper(AFn.java:154)
E/AndroidRuntime( 2508): at clojure.lang.RestFn.applyTo(RestFn.java:132)
E/AndroidRuntime( 2508): at clojure.core$apply.invoke(core.clj:630)
E/AndroidRuntime( 2508): at clojure.core$slurp.doInvoke(core.clj:6645)
E/AndroidRuntime( 2508): at clojure.lang.RestFn.invoke(RestFn.java:410)
E/AndroidRuntime( 2508): at clojure.core$comp$fn__4489.invoke(core.clj:2432)
E/AndroidRuntime( 2508): at clojure.core$comp$fn__4489.invoke(core.clj:2432)
E/AndroidRuntime( 2508): at deps.cljfmt.v0v1v10.cljfmt.core__init.load(Unknown Source)
E/AndroidRuntime( 2508): at deps.cljfmt.v0v1v10.cljfmt.core__init.<clinit>(Unknown Source)
E/AndroidRuntime( 2508): ... 61 more
W/ActivityManager( 867): Force finishing activity hu.erdi.gergo.clojure_android_hello.debug/hu.erdi.gergo.clojure_android_hello.SplashActivity
W/WindowManager( 867): Failure taking screenshot for (180x300) to layer 21010
D/dalvikvm( 867): GC_CONCURRENT freed 561K, 13% free 11324K/12871K, paused 0ms+2ms
W/NetworkManagementSocketTagger( 867): setKernelCountSet(10041, 0) failed with errno -2
您在按照上面引用的教程进行操作时似乎犯了一个小错误。
这个:
:android-user {:plugins [[cider/cider-nrepl "0.9.1"]]
:android {:aot-exclude-ns ["cider.nrepl.middleware.util.java.parser"
"cider.nrepl" "cider-nrepl.plugin"]}}}
应该是:
:android-user {:dependencies [[cider/cider-nrepl "0.9.1"]]
:android {:aot-exclude-ns ["cider.nrepl.middleware.util.java.parser"
"cider.nrepl" "cider-nrepl.plugin"]}}