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

  1. Checkout repo https://github.com/aivanovski/autokpass.git
  2. Creaete package for macOS: ./gradlew packageDmg
  3. 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

Most upvoted comments

@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:

  1. Install openjdk@17 with brew, set JAVA_HOME to where it’s installed (/opt/homebrew/opt/openjdk@17)
  2. Run ./gradlew packageDmg
  3. Remove harfbuzz via brew uninstall --ignore-dependencies harfbuzz
  4. Open the dmg and run the app. It should fail to start, and if you run its executable (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