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 clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to