diff --git a/pkgs/development/tools/jdt-language-server/default.nix b/pkgs/development/tools/jdt-language-server/default.nix new file mode 100644 index 000000000000..e79d212c7d4a --- /dev/null +++ b/pkgs/development/tools/jdt-language-server/default.nix @@ -0,0 +1,103 @@ +{ lib +, stdenv +, fetchurl +, makeWrapper +, jdk +}: + +stdenv.mkDerivation rec { + pname = "jdt-language-server"; + version = "1.8.0"; + timestamp = "202201261434"; + + src = fetchurl { + url = "https://download.eclipse.org/jdtls/milestones/${version}/jdt-language-server-${version}-${timestamp}.tar.gz"; + sha256 = "0wlnsr72hncdqrbpgfl9hgwqw9d9rppq4iymnjmgfn51rjcqadv8"; + }; + + sourceRoot = "."; + + buildInputs = [ + jdk + ]; + + nativeBuildInputs = [ + makeWrapper + ]; + + installPhase = + let + # The application ships with config directories for linux and mac + configDir = if stdenv.isDarwin then "config_mac" else "config_linux"; + in + '' + # Copy jars + install -D -t $out/share/java/plugins/ plugins/*.jar + + # Copy config directories for linux and mac + install -Dm 444 -t $out/share/config ${configDir}/* + + # Get latest version of launcher jar + # e.g. org.eclipse.equinox.launcher_1.5.800.v20200727-1323.jar + launcher="$(ls $out/share/java/plugins/org.eclipse.equinox.launcher_* | sort -V | tail -n1)" + + # The wrapper script will create a directory in the user's cache, copy in the config + # files since this dir can't be read-only, and by default use this as the runtime dir. + # + # The following options are required as per the upstream documentation: + # + # -Declipse.application=org.eclipse.jdt.ls.core.id1 + # -Dosgi.bundles.defaultStartLevel=4 + # -Declipse.product=org.eclipse.jdt.ls.core.product + # -noverify + # --add-modules=ALL-SYSTEM + # --add-opens java.base/java.util=ALL-UNNAMED + # --add-opens java.base/java.lang=ALL-UNNAMED + # + # The following options configure the server to run without writing logs to the nix store: + # + # -Dosgi.sharedConfiguration.area.readOnly=true + # -Dosgi.checkConfiguration=true + # -Dosgi.configuration.cascaded=true + # -Dosgi.sharedConfiguration.area=$out/share/config + # + # Other options which the caller may change: + # + # -Dlog.level: + # Log level. + # This can be overidden by setting JAVA_OPTS. + # + # The caller must specify the following: + # + # -data: + # The application stores runtime data here. We set this to /$PWD + # so that projects don't collide with each other. + # This can be overidden by specifying -configuration to the wrapper. + # + # Java options, such as -Xms and Xmx can be specified by setting JAVA_OPTS. + # + makeWrapper ${jdk}/bin/java $out/bin/jdt-language-server \ + --add-flags "-Declipse.application=org.eclipse.jdt.ls.core.id1" \ + --add-flags "-Dosgi.bundles.defaultStartLevel=4" \ + --add-flags "-Declipse.product=org.eclipse.jdt.ls.core.product" \ + --add-flags "-Dosgi.sharedConfiguration.area=$out/share/config" \ + --add-flags "-Dosgi.sharedConfiguration.area.readOnly=true" \ + --add-flags "-Dosgi.checkConfiguration=true" \ + --add-flags "-Dosgi.configuration.cascaded=true" \ + --add-flags "-Dlog.level=ALL" \ + --add-flags "-noverify" \ + --add-flags "\$JAVA_OPTS" \ + --add-flags "-jar $launcher" \ + --add-flags "--add-modules=ALL-SYSTEM" \ + --add-flags "--add-opens java.base/java.util=ALL-UNNAMED" \ + --add-flags "--add-opens java.base/java.lang=ALL-UNNAMED" + ''; + + meta = with lib; { + homepage = "https://github.com/eclipse/eclipse.jdt.ls"; + description = "Java language server"; + license = licenses.epl20; + maintainers = with maintainers; [ matt-snider ]; + }; +} + diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index bfca44e2701d..14f01f1581d6 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -24330,6 +24330,8 @@ with pkgs; iwona = callPackage ../data/fonts/iwona { }; + jdt-language-server = callPackage ../development/tools/jdt-language-server {}; + jetbrains-mono = callPackage ../data/fonts/jetbrains-mono { }; jost = callPackage ../data/fonts/jost { };