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!
-
@DerReisende77 sagte: Liberica und Azul JDK sollten funktionieren, ein integriertes JavaFX “sollte” nicht notwendig sein.
Nur zur Info: Ich hab eben die neueste Nightly installiert, die ja Java 21 benötigt, und hab wiederum das JDK von Azul installiert.
Es funktioniert nur jenes JDK mit integriertem Java FX (“JDK FX”):Das Liberica JDK hab ich nicht getestet.
-
Im Folgenden eine Anleitung, wie man die Nightlies von MV unter macOS nutzen kann:
- Java installieren: Das JDK von Azul mit integriertem Java FX installieren.
- MV Nightly downloaden.
- Im Finder im Benutzer-Verzeichnis (also dort wo auch der Ordner “Dokumente” oder “Bilder” zu finden ist) im Ordner “Programme” einen Ordner “MediathekView_Nightly” erstellen. Wenn der Ordner “Programme” nicht existiert, diesen zuerst erstellen.
- In den unter Schritt 3 erstellten Ordner die entpackte ZIP-Datei, also den Ordner “MediathekView-latest-nightly-mac” verschieben (rot markierter Ordner im folgenden Screenshot):
-
FFmpeg und FFprobe runterladen und die zwei entpackten Dateien (grün markierte Dateien im obigen Screenshot) in den zuerst zu erstellenden Ordner “bin” verschieben.
-
Mit dem Programm “TextEdit” eine Startdatei mit folgendem Inhalt kreieren (von hier kopieren!):
#!/bin/sh dir=`dirname "$0"` cd "$dir" JAVA_HOME="/Library/Java/JavaVirtualMachines/zulu-22.jdk/Contents/Home" if [ -n "$JAVA_HOME" ]; then "$JAVA_HOME"/bin/java -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=compact -XX:MaxRAMPercentage=50.0 -XX:+UseStringDeduplication --add-exports javafx.base/com.sun.javafx.event=ALL-UNNAMED --add-exports javafx.controls/com.sun.javafx.scene.control.inputmap=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 -Dfile.encoding=UTF-8 -jar ~/Applications/MediathekView_Nightly/MediathekView\-latest\-nightly\-mac/MediathekView\.jar ~/Applications/MediathekView_Nightly/Einstellungen/.mediathek3 $* else java -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=compact -XX:MaxRAMPercentage=50.0 -XX:+UseStringDeduplication --add-exports javafx.base/com.sun.javafx.event=ALL-UNNAMED --add-exports javafx.controls/com.sun.javafx.scene.control.inputmap=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 -Dfile.encoding=UTF-8 -jar ./MediathekView.jar ~/Applications/MediathekView_Nightly/Einstellungen/.mediathek3 $* fi cd $OLDPWD killall Terminal
- Die Datei über das Menü “Format” als “nur Text” formatieren und als UTF-8-kodierte Textdatei mit dem Namen
MediathekView_Portable_Mac_Start.command
(kopieren) abspeichern:
-
Startdatei ausführbar machen: Das Programn “Terminal” öffnen und
sudo chmod a+rx
und einen Leerschlag tippen und dann die unter Schritt 7 erstellte Datei in das Terminal-Fenster hineinziehen, was dann etwa so aussehen sollte:sudo chmod a+rx ~/Applications/MediathekView_Nightly/MediathekView_Portable_Mac_Start.command
Dann die Enter-Taste drücken und das Mac-Passwort eingeben. -
Die nun ausführbar gemachte Startdatei “MediathekView_Portable_Mac_Start.command” (violett markierte Datei im Screenshot weiter oben) in den Ordner “MediathekView_Nightly” verschieben. Ein Doppelklick dieser Datei startet das Programm “MediathekView (Nightly Build)”.
Hinweise:
- Die Pfade und Dateinamen müssen exakt stimmen, sonst funktioniert die Startdatei – ohne entsprechende Anpassungen – nicht.
- Beim Ordner “Programme” handelt es sich nicht um das Verzeichnis, wo alle Programme wie Safari oder Mail zu finden sind, sondern dieser Ordner ist im gleichen Verzeichnis wie z.B. der Ordner “Dokumente” oder “Bilder”, eben das Benutzer-Verzeichnis oder Home-Directory mit dem “Haus-Symbol”.
- In den Ordner Einstellungen kann bei Bedarf der Ordner “.mediathek3” (mit allen MV-Einstellungen) aus einer bestehenden MV-Installation kopiert werden. Dieser unsichtbare Ordner befindet sich im Benutzerverzeichnis und kann mit dem Tastaturbefehl “Command+Shift+.” sichtbar gemacht und damit kopiert werden. Ein erneutes “Command+Shift+.” macht solche Dot-Dateien wieder unsichtbar.
- Wenn ein neues JDK installiert wird (z.B. JDK 23 statt JDK 22), muss der Pfad in der Startdatei entsprechend angepasst werden.
- Wenn eine neue Nightly installiert werden soll, muss jeweils nur die Datei “MediathekView.jar” ersetzt werden.