ClassLoader.getParent to throw exception for module classloader
David M. Lloyd
david.lloyd at redhat.com
Thu Jun 21 09:19:42 PDT 2012
If "null" is to no longer mean "the JDK", then why not make it into a
"nothing" class loader which loads nothing? If it is continuing to mean
the system class loader for base "java." stuff, why not just continue to
let it be the parent? Every module will need visibility to "java.lang"
at the least, right?
On 06/21/2012 11:03 AM, Paul Sandoz wrote:
> Hi,
>
> http://cr.openjdk.java.net/~psandoz/jigsaw/classloader-getparent/webrev/
>
> In a off-list discussion there was a side comment about making ClassLoader.getParent throwing an exception for a module class loader. This type of thing is easy to loose so marking this down in email.
>
> This patch results in the failure of:
>
> jdk/test/org/openjdk/jigsaw/optional-jaxp.sh
>
> See below for the exception in Xerces. The code below is incorrect for module mode because it assumes a hierarchical delegation model. In com.sun.org.apache.xerces.internal.utils.ObjectFactory.findClassLoader:
>
> ClassLoader context = SecuritySupport.getContextClassLoader();
> ClassLoader system = SecuritySupport.getSystemClassLoader();
>
> ClassLoader chain = system;
> while (true) {
> if (context == chain) {
> // Assert: we are on JDK 1.1 or we have no Context ClassLoader
> // or any Context ClassLoader in chain of system classloader
> // (including extension ClassLoader) so extend to widest
> // ClassLoader (always look in system ClassLoader if Xerces
> // is in boot/extension/system classpath and in current
> // ClassLoader otherwise); normal classloaders delegate
> // back to system ClassLoader first so this widening doesn't
> // change the fact that context ClassLoader will be consulted
> ClassLoader current = ObjectFactory.class.getClassLoader();
>
> chain = system;
> while (true) {
> if (current == chain) {
> // Assert: Current ClassLoader in chain of
> // boot/extension/system ClassLoaders
> return system;
> }
> if (chain == null) {
> break;
> }
> chain = SecuritySupport.getParentClassLoader(chain);
> }
>
> // Assert: Current ClassLoader not in chain of
> // boot/extension/system ClassLoaders
> return current;
> }
>
> When ClassLoader.getParent() returns null in module mode it luckily works for the case of loading a class from within the JAXP module itself.
>
> This area of Xerces may need to be cleaned up to use ServiceLoader.
>
> In this respect the exception actually signaled the potential location of the issue that would of otherwise been hidden and trickier to find. However, the approach of throwing an exception does seem brutal. If an XML parser library is barfing, what else will?
>
> Paul.
>
> Exception in thread "main" java.lang.IllegalStateException: A module class loader does not support the hierarchical delegation mode and has no parent.
> at java.lang.ClassLoader.getParent(ClassLoader.java:1429)
> at com.sun.org.apache.xerces.internal.utils.SecuritySupport$3.run(SecuritySupport.java:82)
> at java.security.AccessController.doPrivileged(Native Method)
> at com.sun.org.apache.xerces.internal.utils.SecuritySupport.getParentClassLoader(SecuritySupport.java:78)
> at com.sun.org.apache.xerces.internal.utils.ObjectFactory.findClassLoader(ObjectFactory.java:221)
> at com.sun.org.apache.xerces.internal.utils.ObjectFactory.newInstance(ObjectFactory.java:255)
> at com.sun.org.apache.xerces.internal.impl.dv.DTDDVFactory.getInstance(DTDDVFactory.java:64)
> at com.sun.org.apache.xerces.internal.impl.dv.DTDDVFactory.getInstance(DTDDVFactory.java:49)
> at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.<init>(XML11Configuration.java:565)
> at com.sun.org.apache.xerces.internal.parsers.XIncludeAwareParserConfiguration.<init>(XIncludeAwareParserConfiguration.java:130)
> at com.sun.org.apache.xerces.internal.parsers.XIncludeAwareParserConfiguration.<init>(XIncludeAwareParserConfiguration.java:91)
> at com.sun.org.apache.xerces.internal.parsers.DOMParser.<init>(DOMParser.java:138)
> at com.sun.org.apache.xerces.internal.parsers.DOMParser.<init>(DOMParser.java:122)
> at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.<init>(DocumentBuilderImpl.java:120)
> at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl.newDocumentBuilder(DocumentBuilderFactoryImpl.java:76)
> at sun.util.xml.XMLUtils.getLoadingDoc(XMLUtils.java:99)
> at sun.util.xml.XMLUtils.load(XMLUtils.java:75)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:474)
> at java.util.Properties$XMLUtils.invoke(Properties.java:1157)
> at java.util.Properties$XMLUtils.load(Properties.java:1178)
> at java.util.Properties.loadFromXML(Properties.java:875)
> at org.astro.World.name(World.java:11)
> at com.greetings.Hello.main(Hello.java:5)
>
--
- DML
More information about the jigsaw-dev
mailing list