[Solved] Trying to upgrade the Cryptomator Nix package, help needed fixing an error at runtime!

Hey there,

I began upgrading this package: nixpkgs/default.nix at 9e570d0034df2923b8b4ad158cdc23ddc7d34f1e · NixOS/nixpkgs · GitHub.

After having tried many years ago to make this package and having to give up, thankfully someone posted it, but it’s now pretty much out of date.

Armed with an example, I realized maybe I now can do it!
After having spent more than 3 hours, I came up with this:

{ lib
, stdenv
, fetchFromGitHub
, autoPatchelfHook
, fuse
, packer
, maven3
, openjdk17
, jre
, makeWrapper
, glib
, wrapGAppsHook
}:

let
  pname = "cryptomator";
  version = "1.6.4";

  src = fetchFromGitHub {
    owner = "cryptomator";
    repo = "cryptomator";
    rev = version;
    sha256 = "15pp4fg8q2b9p9zcqqb8lfp3hr5170yj3md5qc9i3lx0dn58qd2i";
  };

  # perform fake build to make a fixed-output derivation out of the files downloaded from maven central (120MB)
  deps = stdenv.mkDerivation {
    name = "cryptomator-${version}-deps";
    inherit src;

    nativeBuildInputs = [ openjdk17 maven3 ];

    preConfigure = ''
      sed '/isKeyLocked/c\//removed temporarily (do we have old OpenJFX on Nix?)' -i  src/main/java/org/cryptomator/ui/controls/SecurePasswordField.java
    '';

    buildPhase = ''
      mvn -Plinux package -Dmaven.repo.local=$out/.m2
    '';

    # keep only *.{pom,jar,sha1,nbm} and delete all ephemeral files with lastModified timestamps inside
    installPhase = ''
      find $out/.m2 -type f -regex '.+\(\.lastUpdated\|resolver-status\.properties\|_remote\.repositories\)' -delete
      find $out/.m2 -type f -iname '*.pom' -exec sed -i -e 's/\r\+$//' {} \;
    '';

    outputHashAlgo = "sha256";
    outputHashMode = "recursive";
    outputHash = "0qp9z2di31dx24s62kb8py93payjbifs4j7727myvz9pss4vv2j2";
  };

in
stdenv.mkDerivation rec {
  inherit pname version src;

  preConfigure = ''
    sed '/isKeyLocked/c\//removed temporarily (do we have old OpenJFX on Nix?)' -i  src/main/java/org/cryptomator/ui/controls/SecurePasswordField.java
  '';
  buildPhase = ''
    mvn -Plinux package --offline -Dmaven.repo.local=${deps}/.m2
  '';
  installPhase = ''
    mkdir -p $out/bin $out/lib
    # moving over all libs
    cp -r ${deps}/.m2/* $out/lib
    cp target/cryptomator-1.6.4.jar $out/lib

    makeWrapper ${jre}/bin/java $out/bin/cryptomator \
      --add-flags "-classpath '$out/lib/*'" \
      --add-flags "-Dcryptomator.settingsPath='~/.config/Cryptomator/settings.json'" \
      --add-flags "-Dcryptomator.ipcPortPath='~/.config/Cryptomator/ipcPort.bin'" \
      --add-flags "-Dcryptomator.logDir='~/.local/share/Cryptomator/logs'" \
      --add-flags "-Dcryptomator.mountPointsDir='~/.local/share/Cryptomator/mnt'" \
      --add-flags "-Djdk.gtk.version=3" \
      --add-flags "-Xss20m" \
      --add-flags "-Xmx512m" \
      --add-flags "org.cryptomator.launcher.Cryptomator" \
      --prefix PATH : "$out/usr/share/cryptomator/libs/:${lib.makeBinPath [ jre glib ]}" \
      --prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath [ fuse ]}" \
      --set JAVA_HOME "${jre.home}"

    # install desktop entry and icons
    cp -r ${src}/dist/linux/appimage/resources/AppDir/usr/* $out/
  '';

  nativeBuildInputs = [ autoPatchelfHook maven3 makeWrapper wrapGAppsHook openjdk17 ];
  buildInputs = [ fuse packer jre glib ];

  meta = with lib; {
    description = "Free client-side encryption for your cloud files";
    homepage = "https://cryptomator.org";
    license = licenses.gpl3Plus;
    maintainers = with maintainers; [ bachp ];
    platforms = platforms.linux;
  };
}

Note that the script is building, but calling cryptomator in the terminal now gives this:

Exception in thread "main" java.lang.NoClassDefFoundError: javax/inject/Provider
        at org.cryptomator.launcher.Cryptomator.<clinit>(Cryptomator.java:34)
Caused by: java.lang.ClassNotFoundException: javax.inject.Provider
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
        ... 1 more

I’ve looked everywhere trying to fix this and as it stands now I’m at a dead end. It’s getting late here and have to put this in the fridge once again, even tho I feel like I’m close. I hope you maybe find the error much quicker than I do, thanks a lot in advance.

Edit 1

I managed to get much further right now. I now get the following error:

01:45:43.787 [JavaFX Application Thread] INFO  o.c.ui.launcher.FxApplicationStarter - JavaFX Runtime started.
Exception in thread "JavaFX Application Thread" java.util.ServiceConfigurationError: org.cryptomator.integrations.keychain.KeychainAccessProvider: Provider org.cryptomator.linux.keychain.KDEWalletKeychainAccess could not be instantiated
        at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:586)
        at java.base/java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:813)
        at java.base/java.util.ServiceLoader$ProviderImpl.get(ServiceLoader.java:729)
        at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
        at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
        at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
        at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
        at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
        at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
        at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
        at org.cryptomator.common.keychain.KeychainModule.provideSupportedKeychainAccessProviders(KeychainModule.java:31)
        at org.cryptomator.common.keychain.KeychainModule_ProvideSupportedKeychainAccessProvidersFactory.provideSupportedKeychainAccessProviders(KeychainModule_ProvideSupportedKeychainAccessProvidersFactory.java:38)
        at org.cryptomator.launcher.DaggerCryptomatorComponent$SwitchingProvider.get(DaggerCryptomatorComponent.java:7725)
        at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
        at org.cryptomator.launcher.DaggerCryptomatorComponent$SwitchingProvider.get(DaggerCryptomatorComponent.java:7720)
        at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
        at org.cryptomator.launcher.DaggerCryptomatorComponent$SwitchingProvider.get(DaggerCryptomatorComponent.java:7714)
        at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
        at org.cryptomator.launcher.DaggerCryptomatorComponent$MainWindowComponentImpl$SwitchingProvider.get(DaggerCryptomatorComponent.java:5533)
        at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
        at org.cryptomator.ui.common.FxmlLoaderFactory.constructController(FxmlLoaderFactory.java:74)
        at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:940)
        at javafx.fxml/javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:982)
        at javafx.fxml/javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:229)
        at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:754)
        at javafx.fxml/javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2808)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2634)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
        at javafx.fxml/javafx.fxml.FXMLLoader$IncludeElement.constructValue(FXMLLoader.java:1156)
        at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:756)
        at javafx.fxml/javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2808)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2634)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
        at javafx.fxml/javafx.fxml.FXMLLoader$IncludeElement.constructValue(FXMLLoader.java:1156)
        at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:756)
        at javafx.fxml/javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2808)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2634)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
        at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2517)
        at org.cryptomator.ui.common.FxmlLoaderFactory.load(FxmlLoaderFactory.java:42)
        at org.cryptomator.ui.common.FxmlLoaderFactory.createScene(FxmlLoaderFactory.java:59)
        at org.cryptomator.ui.common.FxmlLoaderFactory.createScene(FxmlLoaderFactory.java:47)
        at org.cryptomator.ui.mainwindow.MainWindowModule.provideMainScene(MainWindowModule.java:76)
        at org.cryptomator.ui.mainwindow.MainWindowModule_ProvideMainSceneFactory.provideMainScene(MainWindowModule_ProvideMainSceneFactory.java:31)
        at org.cryptomator.launcher.DaggerCryptomatorComponent$MainWindowComponentImpl$SwitchingProvider.get(DaggerCryptomatorComponent.java:5470)
        at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
        at org.cryptomator.ui.mainwindow.MainWindowComponent.showMainWindow(MainWindowComponent.java:28)
        at org.cryptomator.ui.fxapp.FxApplication.lambda$showMainWindow$1(FxApplication.java:114)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
        at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
        at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
        at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(GtkApplication.java:277)
        at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.NoClassDefFoundError: org/freedesktop/dbus/exceptions/DBusException
        at org.cryptomator.linux.keychain.KDEWalletKeychainAccess.<init>(KDEWalletKeychainAccess.java:26)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
        at java.base/java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:789)
        ... 54 more
Caused by: java.lang.ClassNotFoundException: org.freedesktop.dbus.exceptions.DBusException
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/ja

The new script:

{ lib
, stdenv
, fetchFromGitHub
, autoPatchelfHook
, fuse
, packer
, maven3
, openjdk17
, jre
, makeWrapper
, glib
, wrapGAppsHook
}:

let
  pname = "cryptomator";
  version = "1.6.4";

  src = fetchFromGitHub {
    owner = "cryptomator";
    repo = "cryptomator";
    rev = version;
    sha256 = "15pp4fg8q2b9p9zcqqb8lfp3hr5170yj3md5qc9i3lx0dn58qd2i";
  };

  # perform fake build to make a fixed-output derivation out of the files downloaded from maven central (120MB)
  deps = stdenv.mkDerivation {
    name = "cryptomator-${version}-deps";
    inherit src;

    nativeBuildInputs = [ openjdk17 maven3 ];

    preConfigure = ''
      sed '/isKeyLocked/c\//removed temporarily (do we have old OpenJFX on Nix?)' -i  src/main/java/org/cryptomator/ui/controls/SecurePasswordField.java
    '';

    buildPhase = ''
      mvn -Plinux package -Dmaven.repo.local=$out/.m2
    '';

    # keep only *.{pom,jar,sha1,nbm} and delete all ephemeral files with lastModified timestamps inside
    installPhase = ''
      find $out/.m2 -type f -regex '.+\(\.lastUpdated\|resolver-status\.properties\|_remote\.repositories\)' -delete
      find $out/.m2 -type f -iname '*.pom' -exec sed -i -e 's/\r\+$//' {} \;
    '';

    outputHashAlgo = "sha256";
    outputHashMode = "recursive";
    outputHash = "0qp9z2di31dx24s62kb8py93payjbifs4j7727myvz9pss4vv2j2";
  };

in
stdenv.mkDerivation rec {
  inherit pname version src;

  preConfigure = ''
    sed '/isKeyLocked/c\//removed temporarily (do we have old OpenJFX on Nix?)' -i  src/main/java/org/cryptomator/ui/controls/SecurePasswordField.java
  '';
  buildPhase = ''
    mvn -Plinux package --offline -Dmaven.repo.local=${deps}/.m2
  '';
  installPhase = ''
    mkdir -p $out/bin $out/lib
    # moving over all libs
    cp -r target/mods/*.jar $out/lib
    cp target/cryptomator-1.6.4.jar $out/lib

    makeWrapper ${jre}/bin/java $out/bin/cryptomator \
      --add-flags "-classpath '$out/lib/*'" \
      --add-flags "-Dcryptomator.settingsPath='~/.config/Cryptomator/settings.json'" \
      --add-flags "-Dcryptomator.ipcSocketPath='~/.config/Cryptomator/ipc.socket'" \
      --add-flags "-Dcryptomator.logDir='~/.local/share/Cryptomator/logs'" \
      --add-flags "-Dcryptomator.mountPointsDir='~/.local/share/Cryptomator/mnt'" \
      --add-flags "-Djdk.gtk.version=3" \
      --add-flags "-Xss20m" \
      --add-flags "-Xmx512m" \
      --add-flags "org.cryptomator.launcher.Cryptomator" \
      --prefix PATH : "$out/usr/share/cryptomator/libs/:${lib.makeBinPath [ jre glib ]}" \
      --prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath [ fuse ]}" \
      --set JAVA_HOME "${jre.home}"

    # install desktop entry and icons
    cp -r ${src}/dist/linux/appimage/resources/AppDir/usr/* $out/
  '';

  nativeBuildInputs = [ autoPatchelfHook maven3 makeWrapper wrapGAppsHook openjdk17 ];
  buildInputs = [ fuse packer jre glib ];

  meta = with lib; {
    description = "Free client-side encryption for your cloud files";
    homepage = "https://cryptomator.org";
    license = licenses.gpl3Plus;
    maintainers = with maintainers; [ bachp ];
    platforms = platforms.linux;
  };
}

Edit 3

Managed to get the GUI to launch using this! (but mounting crashes my PC, but this could also be me, will test more):

{ lib
, stdenv
, fetchFromGitHub
, autoPatchelfHook
, fuse
, packer
, maven3
, openjdk17
, jre
, makeWrapper
, glib
, wrapGAppsHook
}:

let
  pname = "cryptomator";
  version = "1.6.4";

  src = fetchFromGitHub {
    owner = "cryptomator";
    repo = "cryptomator";
    rev = version;
    sha256 = "15pp4fg8q2b9p9zcqqb8lfp3hr5170yj3md5qc9i3lx0dn58qd2i";
  };

  # perform fake build to make a fixed-output derivation out of the files downloaded from maven central (120MB)
  deps = stdenv.mkDerivation {
    name = "cryptomator-${version}-deps";
    inherit src;

    nativeBuildInputs = [ openjdk17 maven3 ];

    preConfigure = ''
      sed '/isKeyLocked/c\//removed temporarily (do we have old OpenJFX on Nix?)' -i  src/main/java/org/cryptomator/ui/controls/SecurePasswordField.java
    '';

    buildPhase = ''
      mvn -Plinux package -Dmaven.repo.local=$out/.m2
    '';

    # keep only *.{pom,jar,sha1,nbm} and delete all ephemeral files with lastModified timestamps inside
    installPhase = ''
      find $out/.m2 -type f -regex '.+\(\.lastUpdated\|resolver-status\.properties\|_remote\.repositories\)' -delete
      find $out/.m2 -type f -iname '*.pom' -exec sed -i -e 's/\r\+$//' {} \;
    '';

    outputHashAlgo = "sha256";
    outputHashMode = "recursive";
    outputHash = "0qp9z2di31dx24s62kb8py93payjbifs4j7727myvz9pss4vv2j2";
  };

in
stdenv.mkDerivation rec {
  inherit pname version src;

  preConfigure = ''
    sed '/isKeyLocked/c\//removed temporarily (do we have old OpenJFX on Nix?)' -i  src/main/java/org/cryptomator/ui/controls/SecurePasswordField.java
  '';
  buildPhase = ''
    mvn -Plinux package --offline -Dmaven.repo.local=${deps}/.m2
  '';
  installPhase = ''
    mkdir -p $out/bin $out/libs $out/mods
    # moving over all libs
    cp -r target/mods/* $out/mods
    cp target/cryptomator-1.6.4.jar $out/mods
    cp -r target/libs/* $out/libs

    makeWrapper ${jre}/bin/java $out/bin/cryptomator \
      --add-flags "-p '$out/mods'" \
      --add-flags "-classpath '$out/libs/*'" \
      --add-flags "-Dcryptomator.settingsPath='~/.config/Cryptomator/settings.json'" \
      --add-flags "-Dcryptomator.ipcSocketPath='~/.config/Cryptomator/ipc.socket'" \
      --add-flags "-Dcryptomator.logDir='~/.local/share/Cryptomator/logs'" \
      --add-flags "-Dcryptomator.mountPointsDir='~/.local/share/Cryptomator/mnt'" \
      --add-flags "-Djdk.gtk.version=3" \
      --add-flags "-Xss20m" \
      --add-flags "-Xmx512m" \
      --add-flags "-m org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator" \
      --prefix PATH : "$out/usr/share/cryptomator/libs/:${lib.makeBinPath [ jre glib ]}" \
      --prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath [ fuse ]}" \
      --set JAVA_HOME "${jre.home}"

    # install desktop entry and icons
    cp -r ${src}/dist/linux/appimage/resources/AppDir/usr/* $out/
  '';

  nativeBuildInputs = [ autoPatchelfHook maven3 makeWrapper wrapGAppsHook openjdk17 ];
  buildInputs = [ fuse packer jre glib ];

  meta = with lib; {
    description = "Free client-side encryption for your cloud files";
    homepage = "https://cryptomator.org";
    license = licenses.gpl3Plus;
    maintainers = with maintainers; [ bachp ];
    platforms = platforms.linux;
  };
}

Ok so the last edit works, but now I have the following segfault when trying to open a FUSE mount:

09:56:04.009 [App Scheduled Executor 02] INFO  o.c.common.settings.SettingsProvider - Settings saved to /home/peter/.config/Cryptomator/settings.json
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007f4a403c8189, pid=16028, tid=16311
#
# JRE version: OpenJDK Runtime Environment (17.0.1+12) (build 17.0.1+12-nixos)
# Java VM: OpenJDK 64-Bit Server VM (17.0.1+12-nixos, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, linux-amd64)
# Problematic frame:
# C  [jffi1147876796803623234.so+0x7189]
#
# Core dump will be written. Default location: Core dumps may be processed with "/nix/store/q0881awy50g4srnnwasci37y2jk5sf99-systemd-249.5/lib/systemd/systemd-coredump %P %u %g %s %t %c %h" (or dumping to /home/peter/Projects/Trash/cryptomator/core.16028)
#
# An error report file with more information is saved as:
# /home/peter/Projects/Trash/cryptomator/hs_err_pid16028.log
#
# If you would like to submit a bug report, please visit:
#   https://bugreport.java.com/bugreport/crash.jsp
#
[1]    16028 abort (core dumped)  cryptomator

I have he same error with the old Cryptomator, but I hoped something was broken and that tan upgrade would help, but apparently it didn’t. Does anyone have any idea how to fix this?

Edit

Solved by cryptomator: 1.15.15 -> 1.6.4 by peterwilli · Pull Request #150402 · NixOS/nixpkgs · GitHub