[ https://issues.apache.org/jira/browse/FELIX-3296?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Felix Meschberger updated FELIX-3296: ------------------------------------- Attachment: FELIX-3296.patch Proposed patch: Instead of just trying to load the well-known default handlers we have to play some tricks. The patch changes the setup as follows to load each pre-defined scheme: 1. try installed URLStreamHandlerFactory if any 2. try loading well-known handler class through framework class loader 3. try loading well-known handler class through system class loader (ClassLoader.getSystemClassLoader()) The first step IMHO makes sense if the pre-installed factory would overwrite any well-known handler (for example the file: handler from JBoss). The last step is to circumvent the JBoss ModuleClassLoader, which effectively hides the Java Platform classes (as OSGi does). > URLHandlers caches null as values for common protocols > ------------------------------------------------------ > > Key: FELIX-3296 > URL: https://issues.apache.org/jira/browse/FELIX-3296 > Project: Felix > Issue Type: Bug > Components: Framework > Affects Versions: framework-3.0.8 > Environment: Apache Sling org.apache.sling.launchpad-6.war > running in build of current master branch of JBoss Application Server 7 > (https://github.com/jbossas/jboss-as). I'm reporting this against > framework-3.0.8 as that seems to be what's included in Sling, but a review of > the code in 4.0.2 shows the class is the same. > Reporter: Brian Stansberry > Assignee: Karl Pauls > Fix For: framework-4.2.0 > > Attachments: FELIX-3296.patch > > > A JBoss AS7 user has reported being unable to run the Apache Sling web app in > AS 7. I determined that the issue is once > org.apache.felix.framework.URLHandlers is installed as the JVM's > URLStreamHandlerFactory, URLs with protocol "jar" can no longer be parsed.[1] > Here's the problem. Line references are to [2]: > 1) The singleton of this URLHandlers class gets instantiated. It attempts to > load and cache standard handlers for common protocols. At L148 it does this > for "jar". > 2) At L353 it's trying to load one of the standard URLStreamHandler impls for > the "jar" protocol, e.g. sun.net.www.protocol.jar.Handler. It uses > Class.forName("sun.net.www.protocol.jar.Handler"). This fails (returns null) > because the JBoss Modules module for this deployment does not have visibility > to this class. > 3) At L367 it stores "null" for this protocol in its m_builtIn map under key > "jar". > 4) Thereafter any call to createURLStreamHandler (L390) will call into > getBuiltInStreamHandler (L413). That will return null because it will find > the null in m_builtIn stored in step 3) above (L330 & L332). > A fairly simple fix is to at L148 test the result of the > getBuiltInStreamHandler call and if null remove the entry from m_builtIn. It > should probably do the same kind of thing in the init(String) method (L120). > An alternative is to do all the step 1) stuff between L142 and L148 after the > try/catch block at L157. At that point a ref to the standard AS7 > URLStreamHandlerFactory will be available in field m_streamHandlerFactory and > can be used to load the standard handlers rather than relying on > Class.forName. > [1] http://lists.jboss.org/pipermail/jboss-as7-dev/2012-January/004956.html > [2] > http://grepcode.com/file/repo1.maven.org/maven2/org.apache.felix/org.apache.felix.framework/2.0.5/org/apache/felix/framework/URLHandlers.java -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa For more information on JIRA, see: http://www.atlassian.com/software/jira