From 8b6cd28599b2b9add14ad7e066e65e24a0e4b824 Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Mon, 1 Jun 2026 09:18:12 +0200 Subject: [PATCH] maven_4: init at 4.0.0-rc-5 Package Maven 4 as a standalone derivation that can be customized independently of maven. It defaults to jdk25_headless (the JDK can be overridden via that argument), exposed through a local jdk_headless binding so future JDK bumps are a one-line change. maven exposes its package builder as the mkBuildMavenPackage passthru function, which maven_4 reuses to provide its own buildMavenPackage without duplicating build-maven-package.nix. The version tests passthru is exposed as well. buildMaven is intentionally not exposed as it is semi-deprecated. The dependency FOD deletes the .meta directory during cleanup: Maven Resolver 2.0.11+ writes machine- and time-dependent files there, which would otherwise break the fixed-output derivation's hash. A section about maven_4 is added to the Maven manual. Assisted-by: Claude Code (Claude Opus 4.8) --- doc/languages-frameworks/maven.section.md | 53 ++++++++++++ doc/redirects.json | 3 + pkgs/by-name/ma/maven/build-maven-package.nix | 1 + pkgs/by-name/ma/maven/package.nix | 19 +++-- pkgs/by-name/ma/maven_4/package.nix | 82 +++++++++++++++++++ 5 files changed, 153 insertions(+), 5 deletions(-) create mode 100644 pkgs/by-name/ma/maven_4/package.nix diff --git a/doc/languages-frameworks/maven.section.md b/doc/languages-frameworks/maven.section.md index daae60efc3e8..e769b38ee744 100644 --- a/doc/languages-frameworks/maven.section.md +++ b/doc/languages-frameworks/maven.section.md @@ -174,6 +174,59 @@ To make sure that your package does not add extra manual effort when upgrading M ``` +## Maven 4 {#maven-4} + +Alongside the default `maven` package (the latest Maven 3 release), nixpkgs ships `maven_4`, which packages the [Maven 4](https://maven.apache.org/whatsnewinmaven4.html) release line. + +`maven_4` is a standalone derivation and can be used as a drop-in replacement wherever `maven` is used, for example to build a project with the latest Maven 4: + +```nix +{ + lib, + fetchFromGitHub, + jre, + makeWrapper, + maven_4, +}: + +maven_4.buildMavenPackage (finalAttrs: { + pname = "jd-cli"; + version = "1.2.1"; + + src = fetchFromGitHub { + owner = "intoolswetrust"; + repo = "jd-cli"; + tag = "jd-cli-${finalAttrs.version}"; + hash = "sha256-rRttA5H0A0c44loBzbKH7Waoted3IsOgxGCD2VM0U/Q="; + }; + + mvnHash = ""; + + nativeBuildInputs = [ makeWrapper ]; + + installPhase = '' + runHook preInstall + + mkdir -p $out/bin $out/share/jd-cli + install -Dm644 jd-cli/target/jd-cli.jar $out/share/jd-cli + + makeWrapper ${jre}/bin/java $out/bin/jd-cli \ + --add-flags "-jar $out/share/jd-cli/jd-cli.jar" + + runHook postInstall + ''; + + meta = { + description = "Simple command line wrapper around JD Core Java Decompiler project"; + homepage = "https://github.com/intoolswetrust/jd-cli"; + license = lib.licenses.gpl3Plus; + maintainers = with lib.maintainers; [ majiir ]; + }; +}) +``` + +`maven_4` exposes the same `buildMavenPackage` helper as `maven` (see [](#maven-buildmavenpackage)), so all of the patterns documented above apply equally. Note that the Maven dependencies resolved by Maven 4 differ from those resolved by Maven 3, so `mvnHash` must be recomputed when switching between the two. + ## Manually using `mvn2nix` {#maven-mvn2nix} ::: {.warning} This way is no longer recommended; see [](#maven-buildmavenpackage) for the simpler and preferred way. diff --git a/doc/redirects.json b/doc/redirects.json index 51cb45eaaad8..6223a8ff6dca 100644 --- a/doc/redirects.json +++ b/doc/redirects.json @@ -3942,6 +3942,9 @@ "maven": [ "index.html#maven" ], + "maven-4": [ + "index.html#maven-4" + ], "maven-buildmavenpackage": [ "index.html#maven-buildmavenpackage" ], diff --git a/pkgs/by-name/ma/maven/build-maven-package.nix b/pkgs/by-name/ma/maven/build-maven-package.nix index f737507ddb73..9c83430a49be 100644 --- a/pkgs/by-name/ma/maven/build-maven-package.nix +++ b/pkgs/by-name/ma/maven/build-maven-package.nix @@ -112,6 +112,7 @@ let -o -name resolver-status.properties \ -o -name _remote.repositories \) \ -delete + rm -rf $out/.m2/.meta runHook postInstall ''; diff --git a/pkgs/by-name/ma/maven/package.nix b/pkgs/by-name/ma/maven/package.nix index a8379d4f5a97..fbdaaa80885f 100644 --- a/pkgs/by-name/ma/maven/package.nix +++ b/pkgs/by-name/ma/maven/package.nix @@ -47,17 +47,26 @@ stdenvNoCC.mkDerivation (finalAttrs: { // { overrideMavenAttrs = newArgs: makeOverridableMavenPackage mavenRecipe (overrideWith newArgs); }; + + # Exposed so other Maven versions (e.g. maven_4) can reuse the builder + # without duplicating build-maven-package.nix. + mkBuildMavenPackage = + maven: + makeOverridableMavenPackage ( + callPackage ./build-maven-package.nix { + inherit maven; + } + ); in { buildMaven = callPackage ./build-maven.nix { maven = finalAttrs.finalPackage; }; - buildMavenPackage = makeOverridableMavenPackage ( - callPackage ./build-maven-package.nix { - maven = finalAttrs.finalPackage; - } - ); + inherit mkBuildMavenPackage; + + buildMavenPackage = mkBuildMavenPackage finalAttrs.finalPackage; + tests = { version = testers.testVersion { package = finalAttrs.finalPackage; diff --git a/pkgs/by-name/ma/maven_4/package.nix b/pkgs/by-name/ma/maven_4/package.nix new file mode 100644 index 000000000000..9a9b151302f7 --- /dev/null +++ b/pkgs/by-name/ma/maven_4/package.nix @@ -0,0 +1,82 @@ +{ + lib, + fetchurl, + jdk25_headless, + makeWrapper, + maven, + stdenvNoCC, + testers, +}: +let + # Maven 4 defaults to the latest LTS JDK. Bump this binding to change it. + jdk_headless = jdk25_headless; +in +stdenvNoCC.mkDerivation (finalAttrs: { + pname = "maven"; + version = "4.0.0-rc-5"; + + src = fetchurl { + url = "mirror://apache/maven/maven-4/${finalAttrs.version}/binaries/apache-maven-${finalAttrs.version}-bin.tar.gz"; + hash = "sha256-7OalyZ09BBx25/7RgU656jogoSC8s8I1pz0sTo2xbKE="; + }; + + sourceRoot = "."; + + strictDeps = true; + __structuredAttrs = true; + + nativeBuildInputs = [ makeWrapper ]; + + installPhase = '' + runHook preInstall + + mkdir -p $out/maven + cp -r apache-maven-${finalAttrs.version}/* $out/maven + + makeWrapper $out/maven/bin/mvn $out/bin/mvn \ + --set-default JAVA_HOME "${jdk_headless}" + makeWrapper $out/maven/bin/mvnDebug $out/bin/mvnDebug \ + --set-default JAVA_HOME "${jdk_headless}" + + runHook postInstall + ''; + + passthru = { + # Reuse maven's builder so build-maven-package.nix is not duplicated. + buildMavenPackage = maven.mkBuildMavenPackage finalAttrs.finalPackage; + + tests = { + version = testers.testVersion { + package = finalAttrs.finalPackage; + command = '' + env MAVEN_OPTS="-Dmaven.repo.local=$TMPDIR/m2" \ + mvn --version + ''; + }; + }; + }; + + meta = { + homepage = "https://maven.apache.org/"; + description = "Build automation tool (used primarily for Java projects)"; + longDescription = '' + Apache Maven is a software project management and comprehension + tool. Based on the concept of a project object model (POM), Maven can + manage a project's build, reporting and documentation from a central piece + of information. + ''; + changelog = "https://maven.apache.org/docs/${finalAttrs.version}/release-notes.html"; + sourceProvenance = with lib.sourceTypes; [ + binaryBytecode + binaryNativeCode + ]; + license = lib.licenses.asl20; + mainProgram = "mvn"; + maintainers = with lib.maintainers; [ + tricktron + britter + ]; + teams = [ lib.teams.java ]; + inherit (jdk_headless.meta) platforms; + }; +})