Nightlies auf ARM-Macs lauffähig machen (Portable Mode mit Startdatei)
-
Ich hab mit der gleichen Methode wie bisher auf meinem Intel-Mac versucht, die aktuelle Nightly-Version auf meinem neuen M2-Mac zum Laufen zu bringen. Die Methode verwendet den Inhalt des ZIP-Files für Windows-User, wobei Mediathekview.jar mit meinem bisherigen Startskript, d.h. auch mit den den empfohlenen Startparametern und im Portable Mode gelauncht wird. Letzteres ist der Grund, dass ich nicht ein App-Bundle verwende, weil ich so die Kontrolle über den Speicherort der Programmeinstellungen habe.
Auf dem M2-Mac resultieren nun 2 Fehler, wobei MV beim “Filme-Tab laden” hängen bleibt:
WARNING: package sun.awt.X11 not in java.desktop . Configuring baseFilePath /Users/user/bin/Einstellungen_MV/.mediathek3 for portable mode . Programmstart: 2023-08-09T00:48:01.289551 . Version: 14.0.0 . === Java Information === . Vendor: Azul Systems, Inc. . VMname: OpenJDK 64-Bit Server VM . Version: 20.0.2 . Runtime Version: 20.0.2+9 . Maximum Memory: 12288 MB . Operating System: Mac OS X . OS Version: 13.5 . OS Arch: aarch64 . OS Dark Mode enabled: false . OS Available Processors: 8 […] . Konfig wurde gelesen! . WARN: macOS app NOT launched from official launcher! Exception in thread "AWT-EventQueue-0" java.lang.IllegalAccessError: class org.controlsfx.control.textfield.AutoCompletionBinding (in unnamed module @0x69379752) cannot access class com.sun.javafx.event.EventHandlerManager (in module javafx.base) because module javafx.base does not export com.sun.javafx.event to unnamed module @0x69379752 at org.controlsfx.control.textfield.AutoCompletionBinding.<init>(AutoCompletionBinding.java:538) at impl.org.controlsfx.autocompletion.AutoCompletionTextFieldBinding.<init>(AutoCompletionTextFieldBinding.java:107) at impl.org.controlsfx.autocompletion.AutoCompletionTextFieldBinding.<init>(AutoCompletionTextFieldBinding.java:92) at org.controlsfx.control.textfield.TextFields.bindAutoCompletion(TextFields.java:169) at mediathek.javafx.filterpanel.FilmActionPanel.setupThemaComboBox(FilmActionPanel.java:283) at mediathek.javafx.filterpanel.FilmActionPanel.setupViewSettingsPane(FilmActionPanel.java:271) at mediathek.javafx.filterpanel.FilmActionPanel.<init>(FilmActionPanel.java:68) at mediathek.gui.tabs.tab_film.GuiFilme.setupFilmActionPanel(GuiFilme.java:285) at mediathek.gui.tabs.tab_film.GuiFilme.<init>(GuiFilme.java:152) at mediathek.mainwindow.MediathekGui.createTabFilme(MediathekGui.java:673) at mediathek.mainwindow.MediathekGui.initTabs(MediathekGui.java:688) at mediathek.mainwindow.MediathekGui.<init>(MediathekGui.java:179) at mediathek.mac.MediathekGuiMac.<init>(MediathekGuiMac.kt:22) at mediathek.Main.getPlatformWindow(Main.java:646) at mediathek.Main.startGuiMode(Main.java:626) at mediathek.Main.lambda$main$7(Main.java:469) at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318) at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714) at java.base/java.security.AccessController.doPrivileged(AccessController.java:400) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87) at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742) at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90) Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException: Cannot invoke "mediathek.gui.tabs.tab_film.GuiFilme.getTableRowCount()" because "this.mediathekGui.tabFilme" is null at mediathek.mainwindow.FilmSizeInfoLabel.updateValues(FilmSizeInfoLabel.java:38) at mediathek.mainwindow.FilmSizeInfoLabel.actionPerformed(FilmSizeInfoLabel.java:69) at java.desktop/javax.swing.Timer.fireActionPerformed(Timer.java:311) at java.desktop/javax.swing.Timer$DoPostEvent.run(Timer.java:243) at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318) at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714) at java.base/java.security.AccessController.doPrivileged(AccessController.java:400) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87) at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742) at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Ich hab zuerst wie bisher das AdoptJDK verwendet, einfach in der aktuellsten 20er-Version und neu für ARM-Macs (aarch64). Dann habe ich das Liberica-JDK (Full) verwendet, da etwas davon im Changelog zu MV 14 stand. Beides erfolglos. Nun sah ich den Log der Stable-Version an und sah, dass dort das Azul-JDK verwendet wurde, worauf ich es mit dem “Azul-JDK FX” versuchte. Analoge Fehlermeldung (vgl. oben).
Wenn ich das ganze mit dem Jar-File in der “Mac-Version” der ZIP-Datei versuche (MediathekView-latest-nightly-mac.zip), wird nicht mal ein Spash-Screen geladen.
@DerReisende77: Scheint irgendein JavaFX-basiertes Problem zu sein. Kannst du mir da weiterhelfen?
-
@styroll versuche mal beim Start mit java folgende Parameter:
-XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=compact -XX:MaxRAMPercentage=100.0 -XX:+UseStringDeduplication -Dfile.encoding=UTF-8 --add-exports javafx.controls/com.sun.javafx.scene.control.inputmap=ALL-UNNAMED --add-exports javafx.base/com.sun.javafx.event=ALL-UNNAMED --add-exports javafx.controls/com.sun.javafx.scene.control.behavior=ALL-UNNAMED --add-exports javafx.graphics/com.sun.javafx.scene.traversal=ALL-UNNAMED`
Damit sollten die illegal access errors beseitigt sein. Detaillierter kann ich leider nicht gucken da ich derzeit auswärts unterwegs bin.
Liberica und Azul JDK sollten funktionieren, ein integriertes JavaFX “sollte” nicht notwendig sein. Adopt geht nicht da die nicht den Shenandoah GC verwenden. -
@DerReisende77 sagte: versuche mal beim Start mit java folgende Parameter:
-XX:+UseShenandoahGC
-XX:ShenandoahGCHeuristics=compact
-XX:MaxRAMPercentage=100.0
-XX:+UseStringDeduplication
-Dfile.encoding=UTF-8Diese Parameter hatte ich schon verwendet, einfach mit “MaxRAMPercentage=50.0”.
Entscheidend ist nur dieser zusätzliche Parameter:
--add-exports javafx.base/com.sun.javafx.event=ALL-UNNAMED
quasi anstelle vom bisher gesetzten Parameter
--add-opens java.desktop/sun.awt.X11=ALL-UNNAMED
.
Damit sind die zwei Exceptions weg. Hab dann “MaxRAMPercentage” wieder auf “50” gesetzt und die 3 anderen “add-exports”-Parameter gar nicht verwendet. Und das zuletzt installierte Azul-JDK (mit integriertem FX, was offenbar nicht nötig wäre) wurde weiterhin als Laufzeitumgebung verwendet.Besten Dank für die prompte Hilfe.
PS:
Es funktionieren nun beide Jar-File:- Sind im “kleineren” File aus dem ZIP für Mac-User einfach die Java-Klassen draussen, die es für macOS nicht braucht?
- Bzw. spielt es also unter macOS keine Rolle, welche Jar-Datei man verwendet?
-
@styroll der
—add-opens
ist nur unter Linux notwendig, die—add-exports
sind alle gds. notwendig wenn schon bei einem fehlenden gemeckert wird. Ansonsten kann es - je nach verwendetem control im Filter bsp. - passieren dass sich MV mit einer NullPointerException etc verabschiedet und Funktionen nicht ausgeführt werden. Ich würde sie alle drin lassen, sie fressen kein Brot.
-XX:MaxRAMPercentage
kann man je nach Ausstattung mit spielen, dank dem Shenandoah GC sind die Auswirkungen auf dein System aber recht gering da dieser belegten Speicher nun endlich auch freigeben kann. Also wie native Anwendungen. Die Zuweisung sollte so gewählt sein dass MV mindestens 4GB RAM (mehr ist besser) zum Spielen hat. Dieser wird auch nicht dauerhaft belegt. -
@styroll Wie gesagt ich kann gerade nicht nachsehen, aber in der Mac Version können diverse DLLs für Windows nicht drin sein. Ich würde dennoch immer die Jar für das jeweilige OS nehmen, kann ja sein dass ich zukünftig dort Sachen reinpacke die anderswo nicht benötigt werden.
-
@DerReisende77: Besten Dank für die ausführliche Information!