I'm having an issue using (proxy) to extend a class (JViewport) with
an interface (Scrollable). The behavior is as follows: if I clean my
code ("lein clean") then try to run it ("lein run"), I get an
exception. However, if I edit the file that has the proxy, then run
the code again ("lein run"), it works. So there is some weird behavior
with AOT compilation...
Steps to reproduce:
1. Create a new project: $ lein new testproxy
2. Edit project.clj to the following:
(defproject testproxy "1.0.0-SNAPSHOT"
:description "FIXME: write"
:dependencies [[org.clojure/clojure "1.2.0"]
[org.clojure/clojure-contrib "1.2.0"]]
:main testproxy.core)
3. Edit src/testproxy/core.clj to the following:
(ns testproxy.core
(:gen-class)
(:import (javax.swing JFrame))
(:use [testproxy.proxy]))
(defn -main [& args]
(doto (JFrame.)
(.setContentPane scrolled)
(.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)
(.pack)
(.show)))
4. Create src/testproxy/proxy.clj
(ns testproxy.proxy
(:import (java.awt Dimension))
(:import (javax.swing JViewport Scrollable)))
(def scrolled
(proxy [JViewport Scrollable] []
(getPreferredSize []
(Dimension. 50 50))
(getPreferredScrollableViewportSize []
(Dimension. 50 50))
(getScrollableBlockIncrement [visibleRect orientation direction]
1)
(getScrollableUnitIncrement [visibleRect orientation direction]
1)
(getScrollableTracksViewportWidth [] false)
(getScrollableTracksViewportHeight [] false)))
5. $ lein run
You get the following backtrace (at least I do):
Exception in thread "main" java.lang.NoClassDefFoundError: testproxy/
proxy/proxy$javax/swing/JViewport$Scrollable$5c8a670f (NO_SOURCE_FILE:
1)
at clojure.lang.Compiler.eval(Compiler.java:5440)
at clojure.lang.Compiler.eval(Compiler.java:5414)
at clojure.lang.Compiler.eval(Compiler.java:5391)
at clojure.core$eval.invoke(core.clj:2382)
at clojure.main$eval_opt.invoke(main.clj:235)
at clojure.main$initialize.invoke(main.clj:254)
at clojure.main$null_opt.invoke(main.clj:279)
at clojure.main$main.doInvoke(main.clj:354)
at clojure.lang.RestFn.invoke(RestFn.java:422)
at clojure.lang.Var.invoke(Var.java:369)
at clojure.lang.AFn.applyToHelper(AFn.java:165)
at clojure.lang.Var.applyTo(Var.java:482)
at clojure.main.main(main.java:37)
Caused by: java.lang.NoClassDefFoundError: testproxy/proxy/proxy$javax/
swing/JViewport$Scrollable$5c8a670f
at testproxy.proxy$fn__15.invoke(proxy.clj:6)
at testproxy.proxy__init.load(Unknown Source)
at testproxy.proxy__init.<clinit>(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at clojure.lang.RT.loadClassForName(RT.java:1578)
at clojure.lang.RT.load(RT.java:399)
at clojure.lang.RT.load(RT.java:381)
at clojure.core$load$fn__4511.invoke(core.clj:4905)
at clojure.core$load.doInvoke(core.clj:4904)
at clojure.lang.RestFn.invoke(RestFn.java:409)
at clojure.core$load_one.invoke(core.clj:4729)
at clojure.core$load_lib.doInvoke(core.clj:4766)
at clojure.lang.RestFn.applyTo(RestFn.java:143)
at clojure.core$apply.invoke(core.clj:542)
at clojure.core$load_libs.doInvoke(core.clj:4800)
at clojure.lang.RestFn.applyTo(RestFn.java:138)
at clojure.core$apply.invoke(core.clj:544)
at clojure.core$use.doInvoke(core.clj:4880)
at clojure.lang.RestFn.invoke(RestFn.java:409)
at testproxy.core$loading__4410__auto__.invoke(core.clj:1)
at testproxy.core__init.load(Unknown Source)
at testproxy.core__init.<clinit>(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at clojure.lang.RT.loadClassForName(RT.java:1578)
at clojure.lang.RT.load(RT.java:399)
at clojure.lang.RT.load(RT.java:381)
at clojure.core$load$fn__4511.invoke(core.clj:4905)
at clojure.core$load.doInvoke(core.clj:4904)
at clojure.lang.RestFn.invoke(RestFn.java:409)
at clojure.core$load_one.invoke(core.clj:4729)
at clojure.core$load_lib.doInvoke(core.clj:4766)
at clojure.lang.RestFn.applyTo(RestFn.java:143)
at clojure.core$apply.invoke(core.clj:542)
at clojure.core$load_libs.doInvoke(core.clj:4800)
at clojure.lang.RestFn.applyTo(RestFn.java:138)
at clojure.core$apply.invoke(core.clj:542)
at clojure.core$require.doInvoke(core.clj:4869)
at clojure.lang.RestFn.invoke(RestFn.java:409)
at user$eval1.invoke(NO_SOURCE_FILE:1)
at clojure.lang.Compiler.eval(Compiler.java:5424)
... 12 more
Caused by: java.lang.ClassNotFoundException: testproxy.proxy.proxy
$javax.swing.JViewport$Scrollable$5c8a670f
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
... 54 more
6. Now, update the timestamp on proxy.clj: $ touch src/testproxy/
proxy.clj
7. Try "lein run" again. It works...
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en