[ 
https://issues.apache.org/jira/browse/FELIX-712?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Richard S. Hall updated FELIX-712:
----------------------------------

    Fix Version/s: felix-2.0.0

> Ability to disable automatic parent classloader delegation
> ----------------------------------------------------------
>
>                 Key: FELIX-712
>                 URL: https://issues.apache.org/jira/browse/FELIX-712
>             Project: Felix
>          Issue Type: Improvement
>          Components: Framework
>    Affects Versions: felix-1.2.0
>            Reporter: Don Brown
>            Assignee: Karl Pauls
>             Fix For: felix-2.0.0
>
>         Attachments: delegate.patch
>
>
> In debugging a strange issue why a certain test was passing in IDEA, but 
> failing in Maven, we discovered that under certain conditions, Felix will 
> delegate to the parent classloader if it detects another class in the stack 
> who's classloader differs from the classloader of Felix. Specifically, in 
> org.apache.felix.framework.searchpolicy.R4SearchPolicyCore starting in line 
> 541, there is the problematic code block that has this comment:
>        // At this point, the class/resource could not be found by the bundle's
>        // static or dynamic imports, nor its own content. Before we throw
>        // an exception, we will try to determine if the instigator of the
>        // class/resource load was a class from a bundle or not. This is 
> necessary
>        // because the specification mandates that classes on the class path
>        // should be hidden (except for java.*), but it does allow for these
>        // classes/resources to be exposed by the system bundle as an export.
>        // However, in some situations classes on the class path make the 
> faulty
>        // assumption that they can access everything on the class path from
>        // every other class loader that they come in contact with. This is
>        // not true if the class loader in question is from a bundle. Thus,
>        // this code tries to detect that situation. If the class
>        // instigating the load request was NOT from a bundle, then we will
>        // make the assumption that the caller actually wanted to use the
>        // parent class loader and we will delegate to it. If the class was
>        // from a bundle, then we will enforce strict class loading rules
>        // for the bundle and throw an exception.
> What that means is if if you call Bundle.loadClass() from a non-bundle class 
> and you happen to have a class in your stack, which was loaded from a 
> different classloader than Felix, Felix will try to fix your problem by 
> allowing parent classloader delegation. This was the cause of the breakage 
> for us because Maven's Surefire plugin uses its own classloader to load 
> several of its classes and Felix found those in the call stack and decided to 
> enable parent delegation. In IDEA, all the classes were loaded by the same 
> classloader, so our tests passed.
> Specifically, we have code that sits outside Felix and tries to load classes 
> from installed bundles.  Felix sees that the call, by examining the stack, is 
> by code outside a bundle, so it enters this routine that may or may not, 
> depending on the execution environment, delegate the class loading to Felix's 
> class loader.  
> This ticket asks for a configuration setting to be able to disable this bit 
> of code.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to