Mac-spezifische Fehlermeldung auf nicht OS-X-Systemen

Status
Nicht offen für weitere Antworten.

Daniel_L

Bekanntes Mitglied
Hallo,

für mein Java-Programm habe ich für Mac OS X spezielle Methoden, um das Apple-Menü nutzen zu können. Allerdings kommt offensichtlich auf nicht-OS-X-Systemen eine Fehlermeldung:


~$ Zettelkasten
Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError:
com/apple/eawt/ApplicationListener
at zettelkasten.ZettelkastenApp.startup(ZettelkastenApp.java:39)
at org.jdesktop.application.Application$1.run(Application.java:171)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException:
com.apple.eawt.ApplicationListener
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
... 10 more

Im Konstruktor meiner Main-Klasse frage ich die OS-Version folgendermaßen ab und initialisiere bei Bedarf einen Application-Listener für Mac OS X:
Code:
        IS_MAC = System.getProperty("os.name").toLowerCase().startsWith("mac os");
        IS_MAC_AQUA = IS_MAC & settings.getLookAndFeel().contains("Aqua");
...
        // when we have a mac, we need an extra quit-hanlder...
        if (IS_MAC) setupMacOSXApplicationListener();

Den Source für die Methode setupMacOSX... habe ich in einem Blog-Eintrag gefunden und nach eigenen Bedürfnissen angepasst:

Code:
    /**
     * This is an application listener that is initialised when running the program
     * on mac os x. by using this appListener, we can use the typical apple-menu bar
     * which provides own about, preferences and quit-menu-items.
     */
    private void setupMacOSXApplicationListener() {
        try {
            final com.apple.eawt.Application application = com.apple.eawt.Application.getApplication();
            // damit ein about-Menü erscheint
            application.setEnabledAboutMenu(true);
            // preference pane
            application.addPreferencesMenuItem();
            application.setEnabledPreferencesMenu(true);

            application.addApplicationListener(new com.apple.eawt.ApplicationListener() {
                // about dialog
                @Override
                public void handleAbout(com.apple.eawt.ApplicationEvent ae) {
                    showAboutBox();
                    ae.setHandled(true);
                }

                @Override
                public void handleOpenApplication(com.apple.eawt.ApplicationEvent ae) {
                }

                @Override
                public void handlePreferences(com.apple.eawt.ApplicationEvent ae) {
                    settingsWindow();
                }

                @Override
                public void handlePrintFile(com.apple.eawt.ApplicationEvent ae) {
                }

                @Override
                public void handleQuit(com.apple.eawt.ApplicationEvent ae) {
                    ZettelkastenApp.getApplication().exit();
                }

                @Override
                public void handleReOpenApplication(com.apple.eawt.ApplicationEvent ae) {
                }

                @Override
                public void handleOpenFile(com.apple.eawt.ApplicationEvent ae) {
                }
            });
        } catch (Throwable e) {}
    }


Wie kann ich diese Fehlermeldung "umgehen" bzw. an welcher Stelle mit try/catch abfangen?
 

Tobias

Top Contributor
Du mußt die Bibliothek, in der com.apple... drinsteckt, im Classpath haben - auch auf Nicht-Macs.
 

Daniel_L

Bekanntes Mitglied
Hm... wie füge ich die Bibliothek denn zum Classpath hinzu, wenn ich mit NetBeans 6.1 arbeite? Weißt du das zufällig?
 

Tobias

Top Contributor
Such mal nach Classpath, das sollte dutzende relevante Treffer bringen. Wie das in Netbeans geht, weiß ich nicht, nutze Eclipse.
 

Daniel_L

Bekanntes Mitglied
Ich suche gerade nach Hinweisen, hab aber noch keine Lösung gefunden. Aber ich suche weiter. Vielen Dank auf jeden Fall für deinen Hinweis!
 
S

Spacerat

Gast
Hinweise... Hmmm? Das das Dateisystem beim Mac wieder ein anderes ist als bei Windows oder Linux ist hoffentlich beim laden der Classfiles beachtet worden. Immerhin 'ne Fehlerquelle, wenn man eigene Classloader verwendet.

mfg Spacerat
 

Daniel_L

Bekanntes Mitglied
Ich verwende zumindest bewusst keine eigenen Classloader. Ich habe mit NetBeans eine DesktopApp (JSR 296) erstellt und programmiere ein bisschen vor mich in. ;-)

Die notwendigen Jar-Dateien, bspw. für JDOM, habe ich in den Projekteigenschaften hinzugefügt.

Und beim Kompilieren und Starten meines Programms gibt es auch keine Fehlermeldungen, die ClassNotFoundException kommt nur auf nicht-Mac-Systemen. Mich wundert nur, dass darauf nicht von NetBeans hingewiesen wurde? Vielleicht liegt das auch an der Mac-eigenen Java-Version...

Ich weiß jetzt zwar, wie ich bei NetBeans neue Libraries anlege und den Classpath zu diesen Bibliotheken festlege, aber ich weiß nicht, welche Jar-Dateien ich nun für diese Apple-Bibliothek auswählen soll geschweige denn, wo ich diese auf meiner Festplatte finde?
 

Daniel_L

Bekanntes Mitglied
Hier habe ich was gefunden, was ich aber nicht ganz verstehe, und hier ist ein Foren-Beitrag, der mir etwas einfacher umzusetzen erscheint.

Ich werde mal schauen, ob ich das hinkriege.
 

Daniel_L

Bekanntes Mitglied
So, ich denke ich bin einen Schritt weiter. Ich habe jetzt Folgendes:

Code:
        try {
            Class appc = Class.forName("com.apple.eawt.Application");
            Object app = appc.newInstance();

            Class lc = Class.forName("com.apple.eawt.ApplicationListener");
            Object listener = Proxy.newProxyInstance(lc.getClassLoader(), new Class[] { lc }, new InvocationHandler() {
                @Override
                public Object invoke(Object proxy,Method method,Object[] args) {
                    if (method.getName().equals("handleQuit")) {
                        ZettelkastenApp.getApplication().exit();
                    }
                    if (method.getName().equals("handlePreferences")) {
                        settingsWindow();
                    }
                    if (method.getName().equals("handleAbout")) {
                        showAboutBox();
                    }
                    return null;
                }
            });

            try {
                Method m = appc.getMethod("addApplicationListener", lc);
                m.invoke(app, listener);
            } catch (NoSuchMethodException ex) {
                ex.printStackTrace();
            } catch (SecurityException ex) {
                ex.printStackTrace();
            } catch (InvocationTargetException ex) {
                ex.printStackTrace();
            }
        }
        catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        catch (InstantiationException e) {
            e.printStackTrace();
        }

Das scheint auch soweit zu funktionieren. Zwei Fragen habe ich aber noch:

1.) Bei ublic Object invoke wird ein Object als Rückgabewert verlangt. Da ich nicht wusste, was ich zurückgeben sollte, habe ich einfach Null zurückgegeben. Meine Methoden im Listener werden ja trotzdem ausgeführt. Was wäre hier ein "korrekter" Rückgabe-Wert?

2.) In meiner bisherigen Variante hatte ich folgenden Code, der dazu führte, dass auch ein Einstellungs-Menü gezeigt wurde, was jetzt nicht mehr der Fall ist:
Code:
            final com.apple.eawt.Application application = com.apple.eawt.Application.getApplication();
            // damit ein about-Menü erscheint
            application.setEnabledAboutMenu(true);
            // preference pane
            application.addPreferencesMenuItem();
            application.setEnabledPreferencesMenu(true);

            application.addApplicationListener(new com.apple.eawt.ApplicationListener() {
            ...

Kann mir jemand verraten, wie ich das PreferencesMenu wieder sichtbar kriege, welchen Code ich also im ersten Code-Beispiel einfügen muss (bei dem Classloader)?

Vielen Dank und Gruß
Daniel
 

Daniel_L

Bekanntes Mitglied
Hab's herausgefunden. Dies ist jetzt die Lösung, um auf Mac das Apple-Menü zu nutzen, sodass aber das Java-Programm auch auf anderen Plattformen startet:

Code:
    /**
     * This is an application listener that is initialised when running the program
     * on mac os x. by using this appListener, we can use the typical apple-menu bar
     * which provides own about, preferences and quit-menu-items.
     */
    private void setupMacOSXApplicationListener() {
        try {
            // get mac os-x application class
            Class appc = Class.forName("com.apple.eawt.Application");
            // create a new instance for it.
            Object app = appc.newInstance();
            
            // get the application-listener class. here we can set our action to the apple menu
            Class lc = Class.forName("com.apple.eawt.ApplicationListener");
            Object listener = Proxy.newProxyInstance(lc.getClassLoader(), new Class[] { lc }, new InvocationHandler() {
                @Override
                public Object invoke(Object proxy,Method method,Object[] args) {
                    if (method.getName().equals("handleQuit")) {
                        // call the general exit-handler from the desktop-application-api
                        // here we do all the stuff we need when exiting the application
                        ZettelkastenApp.getApplication().exit();
                    }
                    if (method.getName().equals("handlePreferences")) {
                        // show settings window
                        settingsWindow();
                    }
                    if (method.getName().equals("handleAbout")) {
                        // show own aboutbox
                        showAboutBox();
                        // set handled to true, so other actions won't take place any more.
                        // if we leace this out, a second, system-own aboutbox would be displayed
                        com.apple.eawt.ApplicationEvent ae = (ApplicationEvent) args[0];
                        ae.setHandled(true);
                    }
                    return null;
                }
            });

            try {
                // add application listener that listens to actions on the apple menu items
                Method m = appc.getMethod("addApplicationListener", lc);
                m.invoke(app, listener);
                // register that we want that Preferences menu. by default, only the about box is shown
                // but no pref-menu-item
                Method enablePreferenceMethod = appc.getMethod("setEnabledPreferencesMenu", new Class[] {boolean.class});
                enablePreferenceMethod.invoke(app, new Object[] {Boolean.TRUE});
            } catch (NoSuchMethodException ex) {
                ex.printStackTrace();
            } catch (SecurityException ex) {
                ex.printStackTrace();
            } catch (InvocationTargetException ex) {
                ex.printStackTrace();
            }
        }
        catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        catch (InstantiationException e) {
            e.printStackTrace();
        }
    }

Siehe dazu auch diese Seite

Gruß
Daniel
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Joker4632 Methoden Befehl an bereits extern geöffnete Programm-spezifische Konsole senden Allgemeine Java-Themen 1
R Locale spezifische DateFormat Strings? Allgemeine Java-Themen 3
Mick P. F. Wie kriege ich die Fehlermeldung "java: symbol lookup error: ..." weg? Allgemeine Java-Themen 11
thor_norsk Eclipse - Fehlermeldung - JavaFX Allgemeine Java-Themen 24
Zrebna Was bedeutet folgende Fehlermeldung...? Allgemeine Java-Themen 1
A Die unerklärliche Fehlermeldung Allgemeine Java-Themen 5
O long Fehlermeldung Allgemeine Java-Themen 8
ReinerCoder Eclipse Fehlermeldung - The constructor Double(double) is deprecated Allgemeine Java-Themen 8
F Fehlermeldung: java.lang.NoClassDefFoundError: org/apache/commons/net/ntp/NTPUDPClient Allgemeine Java-Themen 6
N Fehlermeldung beheben Allgemeine Java-Themen 6
J Fehlermeldung bei Ausführung von .jar-Datei Allgemeine Java-Themen 9
M stream.Collectors Fehlermeldung Allgemeine Java-Themen 1
R Schlüsselworte "Throw new exception" gibt nicht den String als Fehlermeldung aus Allgemeine Java-Themen 2
N Neustarten des Codes nach der Fehlermeldung Allgemeine Java-Themen 17
M Java-Programminstallation stoppt mit Fehlermeldung Allgemeine Java-Themen 1
C Fehlermeldung Allgemeine Java-Themen 1
M Java Virtual Machine Launcher (Fehlermeldung) Allgemeine Java-Themen 8
0 Code startet nicht (Keine Warnung/Fehlermeldung) Allgemeine Java-Themen 4
Shido JDK installieren Eclipse - Fehlermeldung Allgemeine Java-Themen 4
E Fehlermeldung vor dem Programm code Allgemeine Java-Themen 1
K Interpreter-Fehler Java Zahl Raten Spiel- Fehlermeldung mir unbekannt Allgemeine Java-Themen 12
C Hilfe bei einer Fehlermeldung Allgemeine Java-Themen 5
H Java Mail Fehlermeldung: java.lang.NoClassDefFoundError: javax/mail/internet/AddressException Allgemeine Java-Themen 5
G UUencoding bring Fehlermeldung: No beginn line / Missing 'end' line Allgemeine Java-Themen 0
J Runnable jar-File: Fehlermeldung Allgemeine Java-Themen 2
0 Lösungsweg Client Server Kommunikation Fehlermeldung ausgeben Allgemeine Java-Themen 12
A Fehlermeldung "No vertex field found" Allgemeine Java-Themen 18
K Fehlermeldung mit jar-Datei Allgemeine Java-Themen 2
C Button geben Fehlermeldung aus Allgemeine Java-Themen 5
Hindi93 Fehlermeldung UnsatisfiedLinkError Allgemeine Java-Themen 8
N Hibernate und Fehlermeldung Allgemeine Java-Themen 18
I Fehlermeldung im zusammenhang mit String Allgemeine Java-Themen 5
hdi JVM kackt ab mit spezieller Fehlermeldung Allgemeine Java-Themen 8
A Jar-File startet ohne Aktion und ohne Fehlermeldung Allgemeine Java-Themen 4
E Datenbank/iBatis Fehlermeldung Allgemeine Java-Themen 4
G RCP Eclipse Fehlermeldung beim export Allgemeine Java-Themen 5
J Was bedeutet diese Fehlermeldung? Allgemeine Java-Themen 4
0 case orphaned Fehlermeldung! Allgemeine Java-Themen 2
V fehlermeldung heap space, endlosschleife??? Allgemeine Java-Themen 4
T Merkwürdige Fehlermeldung Allgemeine Java-Themen 5
D jdk fehlermeldung probleme wegen der partition? Allgemeine Java-Themen 10
P JFreeChart Fehlermeldung Allgemeine Java-Themen 2
@ [Eclipse] Fehlermeldung bei import-Anweisung Allgemeine Java-Themen 3
T Unbekannte Fehlermeldung + Lösung? Allgemeine Java-Themen 4
G Fehlermeldung bei RFC Allgemeine Java-Themen 4
G Nachdem die neuste Version v. Java installiert-Fehlermeldung Allgemeine Java-Themen 22
T Fehlermeldung Allgemeine Java-Themen 4
P Fehlermeldung Allgemeine Java-Themen 15
G Split String Array bringt Fehlermeldung Allgemeine Java-Themen 7
P Fehlermeldung Allgemeine Java-Themen 8
MQue Fehlermeldung Allgemeine Java-Themen 5
P ständige Fehlermeldung im Eclipse Allgemeine Java-Themen 2
E Fehlermeldung Allgemeine Java-Themen 3
M Fehlermeldung! (Problem mit einem Prog) Allgemeine Java-Themen 5
E JExcel- Zugriff auf leere Zellen kommt eine Fehlermeldung Allgemeine Java-Themen 6
D JavaMail SMTP Fehlermeldung Allgemeine Java-Themen 2
D JavaMail Fehlermeldung Allgemeine Java-Themen 4
K log4j - Fehlermeldung Allgemeine Java-Themen 2
T Konsole "Fehlermeldung": error hereerror here Allgemeine Java-Themen 4
B Fehlermeldung von dispatcher.forward abfangen Allgemeine Java-Themen 2
A JSP include - keine Fehlermeldung Allgemeine Java-Themen 2
P Fehlermeldung "Die Klasse sun/plugin/javaRunTime kann n Allgemeine Java-Themen 3
E Java Fehlermeldung java.lang.NoClassDefFoundError Allgemeine Java-Themen 3
J Fehlermeldung Allgemeine Java-Themen 5
D Fehlermeldung in .txt speichern Allgemeine Java-Themen 2
S Fehlermeldung Allgemeine Java-Themen 2
P Fehlermeldung beim Speichern eines java files Allgemeine Java-Themen 5
S Fehlermeldung bzgl. VM -> ständiger Absturz Allgemeine Java-Themen 7
S fehlermeldung java.lang.OutOfMemoryError Allgemeine Java-Themen 5
sokobus Fehlermeldung Allgemeine Java-Themen 25
A Fehlermeldung: cannot be resolved Allgemeine Java-Themen 5
C Frage zur Fehlermeldung Allgemeine Java-Themen 3
G Fehlermeldung "cannot resolve symbol" Allgemeine Java-Themen 7
N Fehlermeldung Allgemeine Java-Themen 7
T Hilfe!!! Fehlermeldung... "unable..." Allgemeine Java-Themen 2
Zrebna Wieso sollte man Null-Prüfungen nicht mit Optional-Objekten nutzen? Allgemeine Java-Themen 13
kodela Textfeld nicht rechteckig Allgemeine Java-Themen 10
G Doppelklick auf Javaprogramm klapt nicht Allgemeine Java-Themen 1
W Timer terminiert nicht Allgemeine Java-Themen 5
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
W Überflüssige Deklaration vermeiden...war da nicht mal was? Allgemeine Java-Themen 3
N lwjgl kann textureSampler nicht finden Allgemeine Java-Themen 4
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
T .Jar kann man nicht ausführen Allgemeine Java-Themen 18
P JDK nicht installiert in Net Object Fusion Allgemeine Java-Themen 7
D Image bewegt sich nicht nach Klicken auf Button Allgemeine Java-Themen 15
N Regex schlägt nicht an Allgemeine Java-Themen 10
Y Wieso krieg ich die Unit Tests nicht hin Allgemeine Java-Themen 55
D Erste Schritte Mp3 Datei kann nicht von der Festplatte geöffnet werden - mit ChatGPT erstellt Allgemeine Java-Themen 7
G Popup wird nicht sichtbar Allgemeine Java-Themen 9
8u3631984 Funktions Parameter mit Lombok "NonNull" annotieren wird in Jacococ Testcoverage nicht herausgefiltert Allgemeine Java-Themen 3
kodela String kann nicht zu Pfad konvertiert werden Allgemeine Java-Themen 16
M Apache Proxy Weiterleitung auf Tomcat funktioniert nicht wie gewünscht Allgemeine Java-Themen 1
Momo16 Brauche Hilfe - Java Projekt kann nicht erstellt werden Allgemeine Java-Themen 12
OnDemand ApacheCommon FTP Client zuckt nicht Allgemeine Java-Themen 3
T JavaPoet - (noch) nicht existente Typen Allgemeine Java-Themen 2
E Es ist nicht möglich, eine Batch-Anweisung auszuführen. Allgemeine Java-Themen 9
C Was passt hier nicht bei der Calendar-Class Allgemeine Java-Themen 2
T Testing JUnit5: try ... catch arbeitet nicht sauber Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben