[
https://issues.apache.org/jira/browse/UIMA-3692?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13945448#comment-13945448
]
Marshall Schor commented on UIMA-3692:
--------------------------------------
See UIMA-1714 for a similar kind of issue.
This seems to be an issue of a particular embedding of the UIMA framework,
inside a J2EE (?) or Servlet container (?).
I would attempt to move this kind of thing to the embedding area (if there is
one) of uimaFIT. By that, I mean, if uimaFIT has some part of its design
focussed on getting UIMA pipelines embedded in various "platforms", such as a
Servlet container, etc. Each one of those might have a particular set of
conventions around how they expect to use classloaders.
> Classloading inconsistencies
> ----------------------------
>
> Key: UIMA-3692
> URL: https://issues.apache.org/jira/browse/UIMA-3692
> Project: UIMA
> Issue Type: Bug
> Components: uimaFIT
> Affects Versions: 2.0.0uimaFIT
> Reporter: Richard Eckart de Castilho
> Assignee: Richard Eckart de Castilho
> Priority: Minor
> Fix For: 2.0.1uimaFIT
>
>
> The type discovery mechanism relies on Spring tech and eventually on
> org.springframework.util.ClassUtils.getDefaultClassLoader() which tries the
> following classloaders:
> * Thread.currentThread().getContextClassLoader()
> * ClassUtils.class.getClassLoader()
> This allows it to override the classloader used for type scanning by setting
> the thread classloader.
> However, when we actually instantiate components, we rely on UIMA tech which
> uses:
> * getUimaContextAdmin().getResourceManager().getExtensionClassLoader()
> * Class.forName(annotatorClassName)
> In particular, it does not look at the thread context.
> To make classloading consistent, it appears that uimaFIT should check if
> there is a thread classloader and configure it as the extension classloader
> for UIMA components created via uimaFIT. Because uimaFIT is using mainly
> static methods, respecting the thread classloader appears to be the most
> sensible thing. At least better than setting a global classloader.
> To give some context: I hit this problem when running a uimaFIT pipeline from
> a Jython script. The first problem was to allow uimaFIT to properly scan the
> JARs in sys.path of the script context, which I did by setting the thread
> classloader. After that, I tried to run a UIMA component whose class I had
> defined in the script. UIMA was not able to find the class for this component:
> {noformat}
> Traceback (most recent call last):
> File "./bad.jpy", line 39, in <module>
> runPipeline(
> at
> org.apache.uima.analysis_engine.impl.PrimitiveAnalysisEngine_impl.initializeAnalysisComponent(PrimitiveAnalysisEngine_impl.java:209)
> at
> org.apache.uima.analysis_engine.impl.PrimitiveAnalysisEngine_impl.initialize(PrimitiveAnalysisEngine_impl.java:158)
> at
> org.apache.uima.impl.AnalysisEngineFactory_impl.produceResource(AnalysisEngineFactory_impl.java:94)
> at
> org.apache.uima.impl.CompositeResourceFactory_impl.produceResource(CompositeResourceFactory_impl.java:62)
> at org.apache.uima.UIMAFramework.produceResource(UIMAFramework.java:269)
> at
> org.apache.uima.UIMAFramework.produceAnalysisEngine(UIMAFramework.java:387)
> at
> org.apache.uima.analysis_engine.asb.impl.ASB_impl.setup(ASB_impl.java:255)
> at
> org.apache.uima.analysis_engine.impl.AggregateAnalysisEngine_impl.initASB(AggregateAnalysisEngine_impl.java:429)
> at
> org.apache.uima.analysis_engine.impl.AggregateAnalysisEngine_impl.initializeAggregateAnalysisEngine(AggregateAnalysisEngine_impl.java:373)
> at
> org.apache.uima.analysis_engine.impl.AggregateAnalysisEngine_impl.initialize(AggregateAnalysisEngine_impl.java:186)
> at
> org.apache.uima.impl.AnalysisEngineFactory_impl.produceResource(AnalysisEngineFactory_impl.java:94)
> at
> org.apache.uima.impl.CompositeResourceFactory_impl.produceResource(CompositeResourceFactory_impl.java:62)
> at org.apache.uima.UIMAFramework.produceResource(UIMAFramework.java:269)
> at org.apache.uima.UIMAFramework.produceResource(UIMAFramework.java:314)
> at
> org.apache.uima.UIMAFramework.produceAnalysisEngine(UIMAFramework.java:425)
> at
> org.apache.uima.fit.factory.AnalysisEngineFactory.createEngine(AnalysisEngineFactory.java:204)
> at
> org.apache.uima.fit.pipeline.SimplePipeline.runPipeline(SimplePipeline.java:73)
> at
> org.apache.uima.fit.pipeline.SimplePipeline.runPipeline(SimplePipeline.java:115)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:483)
> org.apache.uima.resource.ResourceInitializationException:
> org.apache.uima.resource.ResourceInitializationException: Annotator class
> "org.python.proxies.__main__$Writer$1" was not found. (Descriptor: <unknown>)
> {noformat}
--
This message was sent by Atlassian JIRA
(v6.2#6252)