1{ lib, stdenv, fetchFromGitHub 2, jdk, maven 3, runtimeShell, makeWrapper 4}: 5 6let 7 platform = 8 if stdenv.isLinux then "linux" 9 else if stdenv.isDarwin then "mac" 10 else if stdenv.isWindows then "windows" 11 else throw "unsupported platform"; 12in 13stdenv.mkDerivation rec { 14 pname = "java-language-server"; 15 version = "0.2.38"; 16 17 src = fetchFromGitHub { 18 owner = "georgewfraser"; 19 repo = pname; 20 # commit hash is used as owner sometimes forgets to set tags. See https://github.com/georgewfraser/java-language-server/issues/104 21 rev = "1dfdc54d1f1e57646a0ec9c0b3f4a4f094bd9f17"; 22 sha256 = "sha256-zkbl/SLg09XK2ZhJNzWEtvFCQBRQ62273M/2+4HV1Lk="; 23 }; 24 25 fetchedMavenDeps = stdenv.mkDerivation { 26 name = "java-language-server-${version}-maven-deps"; 27 inherit src; 28 buildInputs = [ maven ]; 29 30 buildPhase = '' 31 runHook preBuild 32 33 mvn package -Dmaven.repo.local=$out -DskipTests 34 35 runHook postBuild 36 ''; 37 38 installPhase = '' 39 runHook preInstall 40 41 find $out -type f \ 42 -name \*.lastUpdated -or \ 43 -name resolver-status.properties -or \ 44 -name _remote.repositories \ 45 -delete 46 47 runHook postInstall 48 ''; 49 50 dontFixup = true; 51 dontConfigure = true; 52 outputHashAlgo = "sha256"; 53 outputHashMode = "recursive"; 54 outputHash = "sha256-YkcQKmm8oeEH7uyUzV/qGoe4LiI6o5wZ7o69qrO3oCA="; 55 }; 56 57 58 nativeBuildInputs = [ maven jdk makeWrapper ]; 59 60 dontConfigure = true; 61 buildPhase = '' 62 runHook preBuild 63 64 jlink \ 65 ${lib.optionalString (!stdenv.isDarwin) "--module-path './jdks/${platform}/jdk-13/jmods'"} \ 66 --add-modules java.base,java.compiler,java.logging,java.sql,java.xml,jdk.compiler,jdk.jdi,jdk.unsupported,jdk.zipfs \ 67 --output dist/${platform} \ 68 --no-header-files \ 69 --no-man-pages \ 70 --compress 2 71 72 mvn package --offline -Dmaven.repo.local=${fetchedMavenDeps} -DskipTests 73 74 runHook postBuild 75 ''; 76 77 installPhase = '' 78 runHook preInstall 79 80 mkdir -p $out/share/java/java-language-server 81 cp -r dist/classpath dist/*${platform}* $out/share/java/java-language-server 82 83 # a link is not used as lang_server_${platform}.sh makes use of "dirname $0" to access other files 84 makeWrapper $out/share/java/java-language-server/lang_server_${platform}.sh $out/bin/java-language-server 85 86 runHook postInstall 87 ''; 88 89 meta = with lib; { 90 description = "A Java language server based on v3.0 of the protocol and implemented using the Java compiler API"; 91 homepage = "https://github.com/georgewfraser/java-language-server"; 92 license = licenses.mit; 93 maintainers = with maintainers; [ hqurve ]; 94 platforms = platforms.all; 95 }; 96}