Ok I've narrowed it down a bit and it definitely is a classloader
issue...observe this:
hotel_nlp.externals.uima=> c
#<JCasAnnotator_ImplBase$0
hotel_nlp.externals.uima.proxy$org.uimafit.component.JCasAnnotator_ImplBase$0@16059e71>
hotel_nlp.externals.uima=> (class c)
hotel_nlp.externals.uima.proxy$org.uimafit.component.JCasAnnotator_ImplBase$0
hotel_nlp.externals.uima=> (. (ClassLoader/getSystemClassLoader)
loadClass
"hotel_nlp.externals.uima.proxy$org.uimafit.component.JCasAnnotator_ImplBase$0")
;;FAIL
ClassNotFoundException
hotel_nlp.externals.uima.proxy$org.uimafit.component.JCasAnnotator_ImplBase$0
java.net.URLClassLoader$1.run (URLClassLoader.java:366)
hotel_nlp.externals.uima=> (Class/forName
"hotel_nlp.externals.uima.proxy$org.uimafit.component.JCasAnnotator_ImplBase$0"
false (ClassLoader/getSystemClassLoader))
ClassNotFoundException
hotel_nlp.externals.uima.proxy$org.uimafit.component.JCasAnnotator_ImplBase$0
;;FAIL java.net.URLClassLoader$1.run (URLClassLoader.java:366)
hotel_nlp.externals.uima=> (Class/forName
"hotel_nlp.externals.uima.proxy$org.uimafit.component.JCasAnnotator_ImplBase$0")
;;SUCCESS
hotel_nlp.externals.uima.proxy$org.uimafit.component.JCasAnnotator_ImplBase$0
which classloader was used in the last case which succeeded?presumably
Clojure's dynamic classloader...
this is the first time this is happening to me...Ihaven't got a clue
what to do...I don't see an obvious way of setting uima's classloader to
use clojure's dynamic classloader and even if I could who knows what
kind of problems that would bring...
Jim
On 11/04/13 16:36, Jim - FooBar(); wrote:
I found this on SO which seems to be related but the answer proposes
deftype which is not an option for me as I need to extend a particular
class with proxy... I'm completely stuck...
Jim
On 11/04/13 14:10, Jim - FooBar(); wrote:
Hi all,
I'm writing a tiny wrapper around apache UIMA but I'm facing some
classloading issues. Before I start explaining I should point out
that UIMA makes heavy use of the .class member of classes. It is
practically everywhere (a small java code snippet follows for
demonstration of what I mean):
AnalysisEngine goldTagger =
AnalysisEngineFactory.createPrimitive(*GoldTagger.class*,
typeSystem);
Ok let's start...I tried to create a minimal example with proxying
java.awt.Point but the only tool that I have to check whether a class
is present on the classpath is this code:
(try (Class/forName "somePackage.someClass")
(catch ClassNotFoundException cnf "NOT FOUND!"))
which in my made up minimal example returns the class object just
fine (as does for my proper example following which makes things
confusing). That is why I'm not posting the short example...OK here
we go:
;first of all we need a component of our own that is alien to uima
(def regex-tokenizer artefacts/reg-tok) ;a regex-based tokenizer
;then I need to make it uima-compatible - this means extending a
class and overriding 'process(JCas jc)'
(def uima-friendly
(uima-compatible regex-tokenizer squeeze-jcas)) ;everything up to
here works just fine.
;the definitions for 'uima-compatible' & 'squeeze-jcas' follow for
the sake of completeness (feel free to skip them)
(defn uima-compatible [component jcas-input-extractor]
(proxy [org.uimafit.component.JCasAnnotator_ImplBase][]
(process [^JCas jc]
(let [xs (jcas-input-extractor jc)]
(component xs))))) ;;assuming component is a fn for now
(defn squeeze-jcas [^JCas jcas & classes]
(for [c classes
x (JCasUtil/select jcas c)]
x))
;the final step is to produce the actual analysis engine(s) from the
uima components (the proxied versions as they are the ones that are
uima-friendly).
;this is where the classloading problems begin which is very
frustrating as this is the very last step! Using the following fn:
(defn ufit-produce
"Produce UIMA components from your objects without writing any XML
descriptors, via uima-fit."
[& os]
(map #(AnalysisEngineFactory/createPrimitive (class %)
*type-system* (to-array [])) os))
I am doing (ufit-produce uima-friendly) and I get :
*ClassNotFoundException
hotel_nlp.externals.uima.proxy$org.uimafit.component.JCasAnnotator_ImplBase$0
**
**java.net.URLClassLoader$1.run (URLClassLoader.java:366) *
However the class is definitely there since I am able to do thie
following no problem:
*(try (Class/forName
"hotel_nlp.externals.uima.proxy$org.uimafit.component.JCasAnnotator_ImplBase$0")
**
** (catch ClassNotFoundException cnf "NOT FOUND!"))**
**
**
=>hotel_nlp.externals.uima.proxy$org.uimafit.component.JCasAnnotator_ImplBase$0*
What on earthis happening? How am I able to get the class Object
back but the ClassLoader couldn't? This is very weird isn't it?
any insights would be great! :)
Jim
--
--
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
---
You received this message because you are subscribed to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.