I was using defrecord for the first time, to create a type that I wanted to
throw+ via slingshot to signal errors from a library.
I'd seen an example of this in another library, and I pretty much just cut and
pasted it into my project.
I understood that I need to explicitly import the resulting class into clients
that use my library, and attempted to do so.
When loading the client library that uses and imports, I got this:
foo-bar.core.foo-bar-error
[Thrown class java.lang.ClassNotFoundException]
Restarts:
0: [QUIT] Quit to the SLIME top level
Backtrace:
0: java.net.URLClassLoader$1.run(URLClassLoader.java:202)
1: java.security.AccessController.doPrivileged(Native Method)
2: java.net.URLClassLoader.findClass(URLClassLoader.java:190)
3: clojure.lang.DynamicClassLoader.findClass(DynamicClassLoader.java:61)
4: java.lang.ClassLoader.loadClass(ClassLoader.java:306)
5: java.lang.ClassLoader.loadClass(ClassLoader.java:247)
6: java.lang.Class.forName0(Native Method)
7: java.lang.Class.forName(Class.java:169)
8: factmigrate.core$eval1645$loading__4414__auto____1646.invoke(core.clj:1)
9: factmigrate.core$eval1645.invoke(core.clj:1)
--more--
After a LOT of time and experimentation, I finally realized that in my import
statement, I need to replace the hyphen character in my namespace (let's call
my namespace foo-bar.core)
to an underscore.
So in a client of my library, it needs to do something like this
(ns foobarclient.core
(:use foo-bar.core)
(:import foo_bar.core foo-bar-error))
Assuming that somewhere in the foo-bar.core namespace I had done something like
this:
(defrecord foo-bar-error [blah1 blah2])
I am still recovering from this debugging session, but my current thought is
that this was all my fault, and I just need to be smarter about Java interop
and naming issues.
The hyphen/underscore issue is mentioned here:
http://clojure.org/libs
Lib Conventions
Clojure defines conventions for naming and structuring libs:
A lib name is a symbol that will typically contain two or more parts separated
by periods.
A lib's container is a Java resource whose classpath-relative path is derived
from the lib name:
The path is a string
Periods in the lib name are replaced by slashes in the path
Hyphens in the lib name are replaced by underscores in the path
But I did not find this right away, and even after I did find it, it was not
immediately obvious to me what the implication was in an import statement.
So, I simply wanted to document this for the mailing list, in the hope of
preventing others from stumbling into this, and maybe if they do, they will
find this
explanation in their searches…
Don
--
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