compose-multiplatform: Crash on macOS: Library not loaded libharfbuzz.0.dylib
Describe the bug macOS application crashes during startup, stacktrace is below. Jar file works fine.
Affected platforms
- Desktop
Versions
- Kotlin version*: 1.7.20
- Compose Multiplatform version*: 1.4.0
- OS version(s)* (required for Desktop and iOS issues): macOS Monterey 12.6,1
- OS architecture (x86 or arm64): x86
- JDK (for desktop issues): OpenJDK >= 17
To Reproduce
- Checkout repo https://github.com/aivanovski/autokpass.git
- Creaete package for macOS:
./gradlew packageDmg
- Run the application
Additional context Stacktrace
Exception in thread "TimerQueue" java.lang.UnsatisfiedLinkError: /Users/ivaali/Applications/autokpass-compose.app/Contents/runtime/Contents/Home/lib/libfontmanager.dylib: dlopen(/Users/ivaali/Applications/autokpass-compose.app/Contents/runtime/Contents/Home/lib/libfontmanager.dylib, 0x0001): Library not loaded: '/usr/local/opt/harfbuzz/lib/libharfbuzz.0.dylib'
Referenced from: '/Users/ivaali/Applications/autokpass-compose.app/Contents/runtime/Contents/Home/lib/libfontmanager.dylib'
Reason: tried: '/usr/local/opt/harfbuzz/lib/libharfbuzz.0.dylib' (no such file), '/usr/local/lib/libharfbuzz.0.dylib' (no such file), '/usr/lib/libharfbuzz.0.dylib' (no such file)
at java.base/jdk.internal.loader.NativeLibraries.load(Native Method)
at java.base/jdk.internal.loader.NativeLibraries$NativeLibraryImpl.open(Unknown Source)
at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(Unknown Source)
at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(Unknown Source)
at java.base/jdk.internal.loader.NativeLibraries.findFromPaths(Unknown Source)
at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(Unknown Source)
at java.base/java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.base/java.lang.Runtime.loadLibrary0(Unknown Source)
at java.base/java.lang.System.loadLibrary(Unknown Source)
at java.desktop/sun.lwawt.macosx.LWCToolkit$1.run(Unknown Source)
at java.desktop/sun.lwawt.macosx.LWCToolkit$1.run(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Unknown Source)
at java.desktop/sun.lwawt.macosx.LWCToolkit.<clinit>(Unknown Source)
at java.desktop/sun.awt.PlatformGraphicsInfo.createToolkit(Unknown Source)
at java.desktop/java.awt.Toolkit.getDefaultToolkit(Unknown Source)
at java.desktop/java.awt.Toolkit.getEventQueue(Unknown Source)
at java.desktop/java.awt.EventQueue.invokeLater(Unknown Source)
at java.desktop/javax.swing.SwingUtilities.invokeLater(Unknown Source)
at java.desktop/javax.swing.Timer$1.run(Unknown Source)
at java.desktop/javax.swing.Timer$1.run(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Unknown Source)
at java.desktop/javax.swing.Timer.post(Unknown Source)
at java.desktop/javax.swing.TimerQueue.run(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class sun.lwawt.macosx.LWCToolkit
at java.desktop/sun.awt.PlatformGraphicsInfo.createToolkit(Unknown Source)
at java.desktop/java.awt.Toolkit.getDefaultToolkit(Unknown Source)
at java.desktop/javax.swing.UIManager.getSystemLookAndFeelClassName(Unknown Source)
at org.jetbrains.skiko.Actuals_awtKt.setSystemLookAndFeel(Actuals.awt.kt:14)
at org.jetbrains.skiko.Setup.init(Setup.kt:25)
at org.jetbrains.skiko.Setup.init$default(Setup.kt:6)
at org.jetbrains.skiko.Library.load(Library.kt:62)
at org.jetbrains.skia.impl.Library$Companion.staticLoad(Library.jvm.kt:12)
at androidx.compose.ui.ConfigureSwingGlobalsForCompose_desktopKt.configureSwingGlobalsForCompose(ConfigureSwingGlobalsForCompose.desktop.kt:49)
at androidx.compose.ui.ConfigureSwingGlobalsForCompose_desktopKt.configureSwingGlobalsForCompose$default(ConfigureSwingGlobalsForCompose.desktop.kt:38)
at androidx.compose.ui.window.Application_desktopKt.application(Application.desktop.kt:110)
at androidx.compose.ui.window.Application_desktopKt.application$default(Application.desktop.kt:105)
at com.github.ai.autokpass.MainKt.main(Main.kt:39)
Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.UnsatisfiedLinkError: /Users/ivaali/Applications/autokpass-compose.app/Contents/runtime/Contents/Home/lib/libfontmanager.dylib: dlopen(/Users/ivaali/Applications/autokpass-compose.app/Contents/runtime/Contents/Home/lib/libfontmanager.dylib, 0x0001): Library not loaded: '/usr/local/opt/harfbuzz/lib/libharfbuzz.0.dylib'
Referenced from: '/Users/ivaali/Applications/autokpass-compose.app/Contents/runtime/Contents/Home/lib/libfontmanager.dylib'
Reason: tried: '/usr/local/opt/harfbuzz/lib/libharfbuzz.0.dylib' (no such file), '/usr/local/lib/libharfbuzz.0.dylib' (no such file), '/usr/lib/libharfbuzz.0.dylib' (no such file) [in thread "TimerQueue"]
at java.base/jdk.internal.loader.NativeLibraries.load(Native Method)
at java.base/jdk.internal.loader.NativeLibraries$NativeLibraryImpl.open(Unknown Source)
at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(Unknown Source)
at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(Unknown Source)
at java.base/jdk.internal.loader.NativeLibraries.findFromPaths(Unknown Source)
at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(Unknown Source)
at java.base/java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.base/java.lang.Runtime.loadLibrary0(Unknown Source)
at java.base/java.lang.System.loadLibrary(Unknown Source)
at java.desktop/sun.lwawt.macosx.LWCToolkit$1.run(Unknown Source)
at java.desktop/sun.lwawt.macosx.LWCToolkit$1.run(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Unknown Source)
at java.desktop/sun.lwawt.macosx.LWCToolkit.<clinit>(Unknown Source)
at java.desktop/sun.awt.PlatformGraphicsInfo.createToolkit(Unknown Source)
at java.desktop/java.awt.Toolkit.getDefaultToolkit(Unknown Source)
at java.desktop/java.awt.Toolkit.getEventQueue(Unknown Source)
at java.desktop/java.awt.EventQueue.invokeLater(Unknown Source)
at java.desktop/javax.swing.SwingUtilities.invokeLater(Unknown Source)
at java.desktop/javax.swing.Timer$1.run(Unknown Source)
at java.desktop/javax.swing.Timer$1.run(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Unknown Source)
at java.desktop/javax.swing.Timer.post(Unknown Source)
at java.desktop/javax.swing.TimerQueue.run(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
Failed to launch JVM
About this issue
- Original URL
- State: closed
- Created a year ago
- Comments: 21 (9 by maintainers)
Commits related to this issue
- Raise error when Homebrew JDK is used for packaging Resolves #3107 — committed to JetBrains/compose-multiplatform by AlexeyTsvetkov a year ago
- Raise error when Homebrew JDK is used for packaging Resolves #3107 — committed to JetBrains/compose-multiplatform by AlexeyTsvetkov a year ago
- Raise error when Homebrew JDK is used for packaging (#3451) Resolves #3107 — committed to JetBrains/compose-multiplatform by AlexeyTsvetkov a year ago
@avently @aivanovski OpenJDK from homebrew is a distribution built by homebrew people. They explicitly configured build to exclude a few libraries, so these libraries have to be provided by homebrew https://github.com/Homebrew/homebrew-core/blob/a90c3371e08e77f1e3ef788784fd517c7ff6478d/Formula/openjdk%4017.rb#L99
I’m not aware of any other OpenJDK distribution doing this on macOS. I’ve just checked Amazon’s Corretto, Eclipse Temurin (ex. AdoptOpenJDK), JetBrains Runtime, Azul OpenJDK. No one else except Homebrew distribution does this. The PR in Homebrew repo does not contain any reasoning https://github.com/Homebrew/homebrew-core/pull/117588
I’m not sure, what we can do except recommending to avoid Homebrew’s distribution.
Ok, so I managed to reproduce the issue:
openjdk@17
with brew, setJAVA_HOME
to where it’s installed (/opt/homebrew/opt/openjdk@17
)./gradlew packageDmg
brew uninstall --ignore-dependencies harfbuzz
App/Contents/MacOS/app
), it will print the failure to load harfbuzz.Are there any news about this problem? Wasn’t really cool to receive stracktrace with this crash after release.
For now,
brew uninstall openjdk@17 && brew install corretto
works