about summary refs log tree commit diff
path: root/pkgs/by-name/ma/maven/build-maven-package.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/by-name/ma/maven/build-maven-package.nix')
-rw-r--r--pkgs/by-name/ma/maven/build-maven-package.nix98
1 files changed, 98 insertions, 0 deletions
diff --git a/pkgs/by-name/ma/maven/build-maven-package.nix b/pkgs/by-name/ma/maven/build-maven-package.nix
new file mode 100644
index 0000000000000..f9ff54696dfe9
--- /dev/null
+++ b/pkgs/by-name/ma/maven/build-maven-package.nix
@@ -0,0 +1,98 @@
+{ lib
+, stdenv
+, maven
+}:
+
+{ src
+, sourceRoot ? null
+, buildOffline ? false
+, doCheck ? true
+, patches ? [ ]
+, pname
+, version
+, mvnHash ? ""
+, mvnFetchExtraArgs ? { }
+, mvnDepsParameters ? ""
+, manualMvnArtifacts ? [ ]
+, manualMvnSources ? [ ]
+, mvnParameters ? ""
+, ...
+} @args:
+
+# originally extracted from dbeaver
+# created to allow using maven packages in the same style as rust
+
+let
+  mvnSkipTests = lib.optionalString (!doCheck) "-DskipTests";
+  fetchedMavenDeps = stdenv.mkDerivation ({
+    name = "${pname}-${version}-maven-deps";
+    inherit src sourceRoot patches;
+
+    nativeBuildInputs = [
+      maven
+    ] ++ args.nativeBuildInputs or [ ];
+
+    buildPhase = ''
+      runHook preBuild
+    '' + lib.optionalString buildOffline ''
+      mvn de.qaware.maven:go-offline-maven-plugin:1.2.8:resolve-dependencies -Dmaven.repo.local=$out/.m2 ${mvnDepsParameters}
+
+      for artifactId in ${builtins.toString manualMvnArtifacts}
+      do
+        echo "downloading manual $artifactId"
+        mvn dependency:get -Dartifact="$artifactId" -Dmaven.repo.local=$out/.m2
+      done
+
+      for artifactId in ${builtins.toString manualMvnSources}
+      do
+        group=$(echo $artifactId | cut -d':' -f1)
+        artifact=$(echo $artifactId | cut -d':' -f2)
+        echo "downloading manual sources $artifactId"
+        mvn dependency:sources -DincludeGroupIds="$group" -DincludeArtifactIds="$artifact" -Dmaven.repo.local=$out/.m2
+      done
+    '' + lib.optionalString (!buildOffline) ''
+      mvn package -Dmaven.repo.local=$out/.m2 ${mvnSkipTests} ${mvnParameters}
+    '' + ''
+      runHook postBuild
+    '';
+
+    # keep only *.{pom,jar,sha1,nbm} and delete all ephemeral files with lastModified timestamps inside
+    installPhase = ''
+      runHook preInstall
+
+      find $out -type f \( \
+        -name \*.lastUpdated \
+        -o -name resolver-status.properties \
+        -o -name _remote.repositories \) \
+        -delete
+
+      runHook postInstall
+    '';
+
+    # don't do any fixup
+    dontFixup = true;
+    outputHashAlgo = if mvnHash != "" then null else "sha256";
+    outputHashMode = "recursive";
+    outputHash = mvnHash;
+  } // mvnFetchExtraArgs);
+in
+stdenv.mkDerivation (builtins.removeAttrs args [ "mvnFetchExtraArgs" ] // {
+  inherit fetchedMavenDeps;
+
+  nativeBuildInputs = args.nativeBuildInputs or [ ] ++ [
+    maven
+  ];
+
+  buildPhase = ''
+    runHook preBuild
+
+    mvnDeps=$(cp -dpR ${fetchedMavenDeps}/.m2 ./ && chmod +w -R .m2 && pwd)
+    mvn package -o -nsu "-Dmaven.repo.local=$mvnDeps/.m2" ${mvnSkipTests} ${mvnParameters}
+
+    runHook postBuild
+  '';
+
+  meta = args.meta or { } // {
+    platforms = args.meta.platforms or maven.meta.platforms;
+  };
+})