You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@geronimo.apache.org by "Jarek Gawor (JIRA)" <ji...@apache.org> on 2013/07/12 17:19:49 UTC

[jira] [Commented] (GERONIMO-6482) Ensure loading of JVM ext classloader classes from Geronimo bundles

    [ https://issues.apache.org/jira/browse/GERONIMO-6482?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13707005#comment-13707005 ] 

Jarek Gawor commented on GERONIMO-6482:
---------------------------------------

I realized that Karaf sets this property in the etc/config.properties file so I moved your change to that file as well in Geronimo to make things consistent. The end result is pretty much the same anyway. Changes committed in revision 1502585 in 3.0 branch. Please double check if things are still working ok and if so close the bug. 

Thanks for the patch!

                
> Ensure loading of JVM ext classloader classes from Geronimo bundles
> -------------------------------------------------------------------
>
>                 Key: GERONIMO-6482
>                 URL: https://issues.apache.org/jira/browse/GERONIMO-6482
>             Project: Geronimo
>          Issue Type: Bug
>      Security Level: public(Regular issues) 
>          Components: osgi
>    Affects Versions: 3.0.1
>            Reporter: Andy McCright
>            Assignee: Andy McCright
>            Priority: Minor
>         Attachments: sys-prop-patch.txt
>
>
> IBM has changed the classloader used to load com.sun.* (specifically com.sun.script.javascript) classes in JDK 7.  In JDK 6, these classes were loaded by the JVM's boot classloader - in JDK 7, they are loaded via the JVM's ext classloader (a child classloader of the boot loader).  This change has the effect of breaking servlet code like this:
>         ScriptEngineManager manager = new ScriptEngineManager();
>         ScriptEngine engine = manager.getEngineByName("JavaScript");
>         if(engine == null) {
>          throw new RuntimeException("Oh no, unable to find a script engine found for JavaScript");
>         }
> When running Geronimo 3.0.1 on JDK 6, this code works (engine is non-null, no exception is thrown).  When I switch to JDK7, I see:
> ScriptEngineManager providers.next(): javax.script.ScriptEngineFactory: Provider com.sun.script.javascript.RhinoScriptEngineFactory not found
> java.lang.RuntimeException: Oh no, unable to find a script engine found for JavaScript
>     at org.apache.jsp.HelloWorld_jsp._jspService(HelloWorld_jsp.java:96)
>     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
>     at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
>     at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
>     at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
>     at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
>     at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
>     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
>     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
>     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
>     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
>     at org.apache.geronimo.tomcat.GeronimoStandardContext$SystemMethodValve.invoke(GeronimoStandardContext.java:731)
>     at org.apache.geronimo.tomcat.valve.GeronimoBeforeAfterValve.invoke(GeronimoBeforeAfterValve.java:48)
>     at org.apache.geronimo.tomcat.valve.ProtectedTargetValve.invoke(ProtectedTargetValve.java:53)
>     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
>     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
>     at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:947)
>     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
>     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
>     at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1009)
>     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
>     at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
>     at org.apache.geronimo.pool.ThreadPool$1.run(ThreadPool.java:267)
>     at org.apache.geronimo.pool.ThreadPool$ContextClassLoaderRunnable.run(ThreadPool.java:397)
>     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1121)
>     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
>     at java.lang.Thread.run(Thread.java:769)
> The reason this fails is that the bundle's classloader's parent loader is the JVM's boot classloader, not the ext loader - so it cannot load the com.sun.* classes that it needs (and that it could in JDK6).
> One solution to this is to add the following line to <geronimo_home>/etc/system.properties:
> osgi.parentClassloader=ext
> This forces the bundle's to search the ext loader (in addition to the boot loader) on boot delegated loads.
> Jarek suggested using the following system property, which similarly resovles the problem (by forcing all bundles to use the framework classloader as its parent) and is a property used in Karaf:
> org.osgi.framework.bundle.parent=framework

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira