clojure-android / lein-droid

A Leiningen plugin for building Clojure/Android projects
Eclipse Public License 1.0
645 stars 56 forks source link

clojure.set class not found when compiling with clojure contrib (with penumbra) #41

Closed viperscape closed 11 years ago

viperscape commented 11 years ago

I'm trying to include penumbra in my empty project. I was able to run lein droid all to my device but now after including penumbra (which uses clojure contrib's clojure.set apparently) I cannot get it to compile. Perhaps penumbra is too outdated and shouldn't be using contrib, but penumbra itself compiles fine so it seems to be an issue with lein-droid and penumbra. Perhaps I should just use lwjgl instead :-\

Thanks for any help!

Below is the trace running lein droid doall

Generating R.java...
Compiling 1 source files
Compiling Clojure files...
Build type: debug, dynamic compilation: enabled, remote REPL: enabled.
Compiling clojure.contrib.generic.math-functions
Compiling clojure.java.browse
Compiling clojure.contrib.cond
Compiling penumbra.opengl.teapot
Jul 24, 2013 8:09:03 PM penumbra.Natives extractNativeLibs
Jul 24, 2013 8:09:03 PM penumbra.Natives extractNativeLibs
Jul 24, 2013 8:09:03 PM penumbra.Natives extractNativeLibs
Compiling clojure.contrib.accumulators.examples
Exception in thread "main" java.lang.ClassNotFoundException: clojure.set, compil
ing:(clojure/contrib/accumulators.clj:121)
        at clojure.lang.Compiler.analyze(Compiler.java:6281)
        at clojure.lang.Compiler.analyze(Compiler.java:6223)
        at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3548)
        at clojure.lang.Compiler.analyzeSeq(Compiler.java:6457)
        at clojure.lang.Compiler.analyze(Compiler.java:6262)
        at clojure.lang.Compiler.analyze(Compiler.java:6223)
        at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3548)
        at clojure.lang.Compiler.analyzeSeq(Compiler.java:6457)
        at clojure.lang.Compiler.analyze(Compiler.java:6262)
        at clojure.lang.Compiler.analyze(Compiler.java:6223)
        at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5618)
        at clojure.lang.Compiler$FnMethod.parse(Compiler.java:5054)
        at clojure.lang.Compiler$FnExpr.parse(Compiler.java:3674)
        at clojure.lang.Compiler.analyzeSeq(Compiler.java:6453)
        at clojure.lang.Compiler.analyze(Compiler.java:6262)
        at clojure.lang.Compiler.analyzeSeq(Compiler.java:6443)
        at clojure.lang.Compiler.analyze(Compiler.java:6262)
        at clojure.lang.Compiler.analyze(Compiler.java:6223)
        at clojure.lang.Compiler$HostExpr$Parser.parse(Compiler.java:936)
        at clojure.lang.Compiler.analyzeSeq(Compiler.java:6455)
        at clojure.lang.Compiler.analyze(Compiler.java:6262)
        at clojure.lang.Compiler.analyze(Compiler.java:6223)
        at clojure.lang.Compiler.compile1(Compiler.java:7030)
        at clojure.lang.Compiler.compile(Compiler.java:7097)
        at clojure.lang.RT.compile(RT.java:412)
        at clojure.lang.RT.load(RT.java:452)
        at clojure.lang.RT.load(RT.java:425)
        at clojure.core$load$fn__4890.invoke(core.clj:5415)
        at clojure.core$load.doInvoke(core.clj:5414)
        at clojure.lang.RestFn.invoke(RestFn.java:408)
        at clojure.core$load_one.invoke(core.clj:5227)
        at clojure.core$load_lib.doInvoke(core.clj:5264)
        at clojure.lang.RestFn.applyTo(RestFn.java:142)
        at clojure.core$apply.invoke(core.clj:603)
        at clojure.core$load_libs.doInvoke(core.clj:5298)
        at clojure.lang.RestFn.applyTo(RestFn.java:137)
        at clojure.core$apply.invoke(core.clj:605)
        at clojure.core$use.doInvoke(core.clj:5392)
        at clojure.lang.RestFn.invoke(RestFn.java:408)
        at clojure.contrib.accumulators.examples$loading__4784__auto__.invoke(ex
amples.clj:9)
        at clojure.lang.AFn.applyToHelper(AFn.java:159)
        at clojure.lang.AFn.applyTo(AFn.java:151)
        at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3382)
        at clojure.lang.Compiler.compile1(Compiler.java:7035)
        at clojure.lang.Compiler.compile1(Compiler.java:7025)
        at clojure.lang.Compiler.compile(Compiler.java:7097)
        at clojure.lang.RT.compile(RT.java:412)
        at clojure.lang.RT.load(RT.java:452)
        at clojure.lang.RT.load(RT.java:425)
        at clojure.core$load$fn__4890.invoke(core.clj:5415)
        at clojure.core$load.doInvoke(core.clj:5414)
        at clojure.lang.RestFn.invoke(RestFn.java:408)
        at clojure.core$load_one.invoke(core.clj:5227)
        at clojure.core$compile$fn__4895.invoke(core.clj:5426)
        at clojure.core$compile.invoke(core.clj:5425)
        at user$eval11.invoke(NO_SOURCE_FILE:1)
        at clojure.lang.Compiler.eval(Compiler.java:6511)
        at clojure.lang.Compiler.eval(Compiler.java:6501)
        at clojure.lang.Compiler.eval(Compiler.java:6477)
        at clojure.core$eval.invoke(core.clj:2797)
        at clojure.main$eval_opt.invoke(main.clj:302)
        at clojure.main$initialize.invoke(main.clj:321)
        at clojure.main$null_opt.invoke(main.clj:354)
        at clojure.main$main.doInvoke(main.clj:432)
        at clojure.lang.RestFn.invoke(RestFn.java:421)
        at clojure.lang.Var.invoke(Var.java:419)
        at clojure.lang.AFn.applyToHelper(AFn.java:163)
        at clojure.lang.Var.applyTo(Var.java:532)
        at clojure.main.main(main.java:37)
Caused by: java.lang.ClassNotFoundException: clojure.set
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at clojure.lang.DynamicClassLoader.findClass(DynamicClassLoader.java:65)

        at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:266)
        at clojure.lang.RT.classForName(RT.java:2086)
        at clojure.lang.Compiler$HostExpr.maybeClass(Compiler.java:957)
        at clojure.lang.Compiler$HostExpr.access$400(Compiler.java:736)
        at clojure.lang.Compiler.analyzeSymbol(Compiler.java:6658)
        at clojure.lang.Compiler.analyze(Compiler.java:6244)
        ... 68 more
Compilation failed.
viperscape commented 11 years ago

Hmm perhaps I should be looking at libgdx instead if I want to target android

alexander-yakushev commented 11 years ago

Hello viperscape,

This particular issue is a bug in clojure-contrib. You can see it here: https://github.com/richhickey/clojure-contrib/blob/master/src/main/clojure/clojure/contrib/accumulators.clj#L121, the clojure.set namespace is referenced without being required explicitly. Maybe it worked with Clojure 1.2, but when doing Clojure/Android builds you can use only one version of each library (in this case, org.clojure-android/clojure 1.5.x is included).

If you are keen on using Penumbra on Android, be prepared that it is a rabbit hole. As I said, only one version of the library will be included, and preferably it is the newer version, so you will have to patch Penumbra to make it work with newer Clojure. This involves rewriting clojure-contrib which I highly doubt you want to do:).

I also think you should try libgdx instead. @ayamada is doing a great job on bringing all necessary stuff together to develop with LibGDX on Android: https://github.com/ayamada/clan.

viperscape commented 11 years ago

thanks for the information! I was surprised penumbra even used clojure contribs set. I was looking at jogamp funny enough, I'll check out libgdx too