NoClassDefFoundError: com/sun/java/accessibility/util/SwingEventMonitor

David Holmes David.Holmes at oracle.com
Wed Aug 4 04:57:13 UTC 2010


Peter,

This kind of problem is why the ContextClassLoader was introduced. 
Anytime you have a SPI where the core libs needs to find a (potentially) 
externally defined concrete implementation, the bootstrap loader can't 
find it, so the context loader has to be set and used - generally to 
jump back down to the application class loader.

Not sure where the fault lies as I don't have this code locally.

David Holmes

Pete Brunet said the following on 08/04/10 14:12:
> The failure is on this line of code:
> AWTEventMonitor.addFocusListener(this)
> which resides in ...\classes\sun\awt\windows\accessibility
> 
> AWTEventMonitor is a class in jaccess-1_4.jar which is in lib/ext
> 
> However, just before the failing line is executed, a println shows these 
> two system properties
> java.ext.dir: null
> java.class.path: \Program 
> Files\Java\jdk1.6.0_20\demo\jfc\SwingSet2\SwingSet2.jar
> 
> so that seems to explain why a class in a jar in lib/ext won't be found 
> (unless there is some other internal means being used to find jar files).
> 
> Since I suspect I'll eventually merge this package into the jdk, to 
> continue debugging I extracted the jar into the classes directory.
> 
> Pete
> ===
> Pete Brunet wrote:
>> The class loading info wasn't helpful.  If I run jdb I get the log shown
>> below.  So far the debug info isn't making sense.  Hopefully it will
>> tomorrow :-)  If someone can decipher this from the log that would be
>> helpful. 
>>
>> Exception occurred: java.lang.NoClassDefFoundError (to be caught at:
>> com.sun.java.accessibility.util.EventQueueMonitor.addTopLevelWindow(),
>> line=279 bci=119)"thread=AWT-EventQueue-0",
>> sun.awt.windows.accessibility.AccessibleContextMirror.<init>(), line=584
>> bci=766
>>
>> Also, do I need to change my build in order to use jdb?  One source
>> indicated I need to use a -g option at compile time.  Perhaps this is
>> why the jdb threads output doesn't show thread IDs.
>>
>> Thanks, Pete
>>
>> === log of debug session ===
>> C:\SwingSet2>c:\OpenJDK-b96m\jdk7\build\windows-i586-fastdebug\bin\jdb
>> SwingSet2
>>
>> java.util.ServiceConfigurationError: com.sun.jdi.connect.Connector:
>> Provider sun.jvm.hotspot.jdi.SACoreAttachingConnector not found
>> java.util.ServiceConfigurationError: com.sun.jdi.connect.Connector:
>> Provider sun.jvm.hotspot.jdi.SADebugServerAttachingConnector not found
>> java.util.ServiceConfigurationError: com.sun.jdi.connect.Connector:
>> Provider sun.jvm.hotspot.jdi.SAPIDAttachingConnector not found
>> Initializing jdb ...
>>   
>>> stop at sun.awt.windows.accessibility.AccessibleContextMirror:584
>>>     
>> Deferring breakpoint
>> sun.awt.windows.accessibility.AccessibleContextMirror:584.
>> It will be set after the class is loaded.
>>   
>>> run
>>>     
>> run SwingSet2
>> Set uncaught java.lang.Throwable
>> Set deferred uncaught java.lang.Throwable
>>   
>> VM Started:
>>
>> wins.length = 1
>>
>> Set deferred breakpoint
>> sun.awt.windows.accessibility.AccessibleContextMirror:584
>>
>> Breakpoint hit: "thread=AWT-EventQueue-0",
>> sun.awt.windows.accessibility.AccessibleContextMirror.<init>(), line=584
>> bci=765
>>
>> AWT-EventQueue-0[1] catch java.lang.NoClassDefFoundError
>> Deferring all java.lang.NoClassDefFoundError.
>> It will be set after the class is loaded.
>> AWT-EventQueue-0[1] step
>>   
>>> Set deferred all java.lang.NoClassDefFoundError
>>>     
>>
>> Exception occurred: java.lang.NoClassDefFoundError (to be caught at:
>> com.sun.java.accessibility.util.EventQueueMonitor.addTopLevelWindow(),
>> line=279 bci=119)"thread=AWT-EventQueue-0",
>> sun.awt.windows.accessibility.AccessibleContextMirror.<init>(), line=584
>> bci=766
>>
>> AWT-EventQueue-0[1] threads
>> Group system:
>>   (java.lang.ref.Reference$ReferenceHandler)0x122                  
>> Reference Handler                      cond. waiting
>>   (java.lang.ref.Finalizer$FinalizerThread)0x121                   
>> Finalizer                           cond. waiting
>>   (java.lang.Thread)0x120                                          
>> Signal Dispatcher                      running
>>   (java.lang.Thread)0x11f                                          
>> Attach Listener                        running
>>   (java.lang.Thread)0x252                                          
>> Java2D Disposer                        cond. waiting
>>   (java.lang.Thread)0x59e                                          
>> TimerQueue                           cond. waiting
>> Group main:
>>   (java.lang.Thread)0x255                                          
>> AWT-Shutdown                           cond. waiting
>>   (java.lang.Thread)0x256                                          
>> AWT-Windows                           running
>>   (com.sun.java.accessibility.util.ComponentEvtDispatchThread)0x26a
>> EventQueueMonitor-ComponentEvtDispatch cond. waiting
>>   (java.awt.EventDispatchThread)0x3bc                              
>> AWT-EventQueue-0                       running
>>   (SwingSet2$DemoLoadThread)0x691                                  
>> Thread-1                           running
>>   (java.lang.Thread)0x692                                          
>> DestroyJavaVM                          running
>>
>> === end log of debug session ===
>>
>> === code for addTopLevelWindow ===
>>
>>     static boolean addTopLevelWindow(Component c) {
>>         Container parent;
>>
>>         if (c == null) {
>>             return false;
>>         }
>>
>>         if (!(c instanceof Window)) {
>>             return addTopLevelWindow(c.getParent());
>>         }
>>
>>         if ((c instanceof Dialog) || (c instanceof Window)) {
>>             parent = (Container) c;
>>         } else {
>>             parent = c.getParent();
>>             if (parent != null) {
>>                 return addTopLevelWindow(parent);
>>             }
>>         }
>>
>>         if (parent == null) {
>>             parent = (Container) c;
>>         }
>>
>>         // Because this method is static, do not make it synchronized
>> because
>>         // it can lock the whole class.  Instead, just lock what needs to be
>>         // locked.
>>         //
>>         synchronized (topLevelWindows) {
>>             if ((parent != null) && !topLevelWindows.contains(parent)) {
>>                 topLevelWindows.addElement(parent);
>>                 if (topLevelWindowListener != null) {
>>                    
>> topLevelWindowListener.topLevelWindowCreated((Window) parent);
>>                 }
>>                 return true;
>>             } else {
>>                 return false;
>>             }
>>         }  <----- this is line 279 (if I have the correct source file)
>>     }
>>
>> === end of code for addTopLevelWindow ===
>>
>> David Holmes wrote:
>>   
>>> You add it in conjunction with the -XX:+TraceClassLoading.
>>>
>>> David
>>>
>>> Pete Brunet said the following on 08/03/10 10:15:
>>>     
>>>> Hi David, I didn't get any output at all from that one - though it
>>>> appears to be a valid parameter as it didn't result in an error
>>>> message.  -Pete
>>>>
>>>> David Holmes wrote:
>>>>       
>>>>> Peter,
>>>>>
>>>>> Try adding -XX:+Verbose to get extra info
>>>>>
>>>>> David
>>>>>
>>>>> Pete Brunet said the following on 08/03/10 02:57:
>>>>>         
>>>>>> Thanks David, Those options tell me which classes were succesfully
>>>>>> loaded but not what classes the class loader was trying to load
>>>>>> when the
>>>>>> class loader was attempting to load SwingEventMonitor.  Is there a way
>>>>>> to get a deeper dump while a particular class is being loaded?  -Pete
>>>>>>
>>>>>> David Holmes wrote:
>>>>>>           
>>>>>>> Try -verbose:class or -XX:+TraceClassLoading
>>>>>>>
>>>>>>> HTH
>>>>>>>
>>>>>>> David Holmes
>>>>>>>
>>>>>>> Pete Brunet said the following on 07/31/10 07:53:
>>>>>>>             
>>>>>>>> This blog post has been helpful to at least start the investigation:
>>>>>>>> http://www.jroller.com/sjivan/entry/difference_between_classnotfoundexception_and_noclassdeffounderror
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> However, I haven't found anything yet similar to the cases
>>>>>>>> discussed in
>>>>>>>> the blog entry.  Since SwingEventMonitor was last updated for 1.4
>>>>>>>> I do
>>>>>>>> see the use of Class and ListModel instead of Class<T> and
>>>>>>>> ListModel<T>
>>>>>>>> but it seems like this would not cause a NoClassDefFoundError.
>>>>>>>>
>>>>>>>> Other than visual inspection (which I've done) is there a technique
>>>>>>>> for
>>>>>>>> determining what classes the class loader is attempting to load as
>>>>>>>> SwingEventMonitor is being loaded?
>>>>>>>>
>>>>>>>> Thanks, Pete
>>>>>>>>
>>>>>>>> Pete Brunet wrote:
>>>>>>>>               
>>>>>>>>> What is the correct way to fix this?
>>>>>>>>>
>>>>>>>>> Exception in thread "AWT-EventQueue-0"
>>>>>>>>> java.lang.NoClassDefFoundError:
>>>>>>>>> com/sun/java/accessibility/util/SwingEventMonitor
>>>>>>>>>         at
>>>>>>>>> sun.awt.windows.accessibility.AccessibleContextMirror.<init>(AccessibleContextMirror.java:583)
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> This class lives in jaccess-1_4.jar which I copy to lib\ext and is
>>>>>>>>> documented here:
>>>>>>>>> http://download.oracle.com/docs/cd/E17802_01/j2se/javase/technologies/accessibility/docs/jaccess-1.3/doc/api/com/sun/java/accessibility/util/package-summary.html
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Since (as far as I know) this class isn't part of the OpenJDK I
>>>>>>>>> expected
>>>>>>>>> javac to fail but it didn't (at least as far as the log shows):
>>>>>>>>>
>>>>>>>>> ...
>>>>>>>>> # Java sources to be compiled: (listed in file
>>>>>>>>> c:/OPF6CE~1/jdk7/build/WINDOW~2/tmp/sun/sun.awt/awt/.classes.list)
>>>>>>>>> ../../../src/windows/classes/sun/awt/windows/Accessibility/AccessibleContextMirror.java
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> # Running javac:
>>>>>>>>> c:/OPF6CE~1/jdk7/build/WINDOW~2/J2SDK-~1/bin/javac
>>>>>>>>> -J-XX:ThreadStackSize=768 -J-XX:-PrintVMOptions
>>>>>>>>> -J-XX:+UnlockDiagnosticVMOptions -J-XX:-LogVMOutput -J-client
>>>>>>>>> -J-Xmx395m
>>>>>>>>> -J-Xms128m -J-XX:PermSize=32m -J-XX:MaxPermSize=160m -source 7
>>>>>>>>> -target 7
>>>>>>>>> -encoding ascii
>>>>>>>>> -Xbootclasspath:c:/OPF6CE~1/jdk7/build/WINDOW~2/classes
>>>>>>>>> -sourcepath
>>>>>>>>> c:/OPF6CE~1/jdk7/build/WINDOW~2/gensrc;../../../src/windows/classes;../../../src/share/classes
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> -d c:/OPF6CE~1/jdk7/build/WINDOW~2/classes
>>>>>>>>> @c:/OPF6CE~1/jdk7/build/WINDOW~2/tmp/sun/sun.awt/awt/.classes.list.filtered
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> /usr/bin/mkdir -p
>>>>>>>>> c:/OPF6CE~1/jdk7/build/WINDOW~2/tmp/sun/sun.awt/awt/obj
>>>>>>>>> ...
>>>>>>>>>
>>>>>>>>> The source for SwingEventMonitor isn't in any of the three
>>>>>>>>> directories
>>>>>>>>> in the -sourcepath.
>>>>>>>>>
>>>>>>>>> What files should I provide and where should I put them, both for
>>>>>>>>> compile time and run time?
>>>>>>>>>
>>>>>>>>> Thanks, Pete
>>>>>>>>>   
>>>>>>>>>                 



More information about the build-dev mailing list