|Summary:||AntClassLoader returns false loader in getParent()|
|Product:||Ant||Reporter:||Rainer Noack <rainer>|
|Component:||Core||Assignee:||Ant Notifications List <notifications>|
|Bug Depends on:|
Description Rainer Noack 2005-06-20 21:59:42 UTC
Calling getParent() on oata.AntClassLoader doesn't return the - expected - actual parent classloader but allways the SystemClassLoader. The Reason is simple: Parent-Property is immutuable in java.lang.ClassLoader and getParent() is final. AntClassLoader has a local, mutuable parent property that can be set via setParent(ClassLoader). However, there should be a way to get AntClassLoader's real parent loader. I see two solutions: 1. Remove the local property and it's setter-method. Allow setting of the parent only in the constructors. Use ClassLoader's parent property. Advantages: IMHO, the cleanest solution. Disadvantages: Many build brakes. Fazit: Not usable 2. Provide a "special" getter like getRealParent() Advantages: works with existing environments. Disadvantages: such a shame Fazit: No better way !? Any other idea? Regards Rainer
Comment 1 Peter Reilly 2006-09-03 16:44:27 UTC
This will be fixed in ant 1.7. I have added a new constructor to set the parent classloader and made all the other constructors deprecated. I have not converted all uses to use the new constructor (since some of them do strange things), however I have modifed the setParent() to use reflection to attempt to set the private field of the super class to the new parent.
Comment 2 Peter Reilly 2006-09-05 13:15:46 UTC
The change had to be reverted as it did work for java 1.4 and lower. In java 5, ClassLoader.getResources() is protected, in java 1.4, it is private.
Comment 3 Matt Benson 2006-09-05 14:01:33 UTC
(In reply to comment #2) > The change had to be reverted as it did work > for java 1.4 and lower. > > In java 5, ClassLoader.getResources() is protected, > in java 1.4, it is private. > Can Dale Anson's "object rape" technique (see ac Variable task) be used here?
Comment 4 Peter Reilly 2006-09-05 14:34:45 UTC
No, one would have to change the class itself, not the use of the class. Well.., we could do this, but it would mess up the JDK rt.jar file..... Users call classloader.getResources() to get the resources. As ClassLoader.getResources() is final in java 1.4 (but not in java 5), AntClassLoader cannot have a getResources() method. It has to fake the getResources by not having a parent as seen by ClassLoader.getResources().
Comment 5 Peter Reilly 2006-09-05 14:36:17 UTC
Opps, hit the wrong button... reopen
Comment 6 Stefan Bodewig 2009-02-23 05:18:36 UTC
*** This bug has been marked as a duplicate of bug 46759 ***
Comment 7 Stefan Bodewig 2009-07-22 02:51:53 UTC
the getResources issue is fixed in the Java5 case now. I don't think we would achieve much by setting ClassLoader.parent since we'd still have to deal with parentFirst and setIsolated in a way incompatible with the base implementation. In order to close this issue I've simply added a getConfiguredParent method in svn revision 796649