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}