Summary
mvn --version hangs indefinitely with Maven 4.0.0-rc-6 under JDK 25 in a Linux container environment.
The same command works with Maven 4.0.0-rc-5under the same conditions.
This appears to be a regression in rc-6.
Environment
- OS: Linux (container)
- Container image:
openjdk:25-ea-jdk-bullseye
- Java: OpenJDK 25
- Maven versions compared:
4.0.0-rc-5 (works)
4.0.0-rc-6 (hangs)
Regression statement
Under the sam eruntime and command line:
apache-maven-4.0.0-rc-5/bin/mvn --batch-mode --errors --show-warnings --version exits successfully
apache-maven-4.0.0-rc-6/bin/mvn --batch-mode --errors --show-warnings --version hangs and must be killed
Reproduction (self-contained, JDK-only)
This script below avoids external package installs and uses only JDK tools available in the image.
docker run --rm -it openjdk:25-ea-jdk-bullseye bash -ilc '
mkdir -p /tmp/mvncmp
cd /tmp/mvncmp
cat <<"EOF" > Downloader.java
import java.io.InputStream;
import java.net.URI;
import java.nio.file.*;
public class Downloader {
public static void main(String[] args) throws Exception {
try (InputStream in = URI.create(args[0]).toURL().openStream()) {
Files.copy(in, Paths.get(args[1]), StandardCopyOption.REPLACE_EXISTING);
}
}
}
EOF
for v in 4.0.0-rc-5 4.0.0-rc-6; do
url="https://archive.apache.org/dist/maven/maven-4/${v}/binaries/apache-maven-${v}-bin.zip"
zip="apache-maven-${v}-bin.zip"
dir="apache-maven-${v}"
echo "Downloading ${url}"
/usr/local/openjdk-25/bin/java Downloader.java "${url}" "${zip}"
mkdir -p "${dir}"
(cd "${dir}" && /usr/local/openjdk-25/bin/jar xf "../${zip}")
mv "${dir}/apache-maven-${v}"/* "${dir}"
rmdir "${dir}/apache-maven-${v}"
chmod +x "${dir}/bin/mvn"
echo "== ${v} =="
timeout -k 5s 40s "${dir}/bin/mvn" --batch-mode --errors --show-version --version
echo "rc=$?"
done
'
Expected result
Both versions print Maven version and exit with code 0.
Actual result
rc-5: exits with 0
rc-6: hangs; timeout kills process (rc=124 from timeout wrapper, process termination observed)
Thread dump evidence from rc-6
While hung, jcmd <pid> Thread.print -l shows:
main thread waiting in CompleteableFuture.get() from org.apache.maven.jline.FastTerminal.getTerminal
- a separate
fast-terminal-thread also waiting in the same path
- stack includes Jline FFM terminal provider intitialization (
org.jline.terminal.impl.ffm.CLibrary)
Relevant frames:
"main" ... WAITING (parking)
at java.util.concurrent.CompletableFuture.get
at org.apache.jline.FastTerminal.getTerminal(FastTerminall.java:68)
at org.apache.jline.FastTerminal.getType(FastTerminal.java:201)
at org.apache.slf4j.MavenSimpleLogger.configure(...)
at org.apache.cling.invoker.LookupInvoker.activeLogging(...)
"fast-terminal-thread" ... WAITING (parking)
at java.util.concurrent.CompletableFuture.get
at org.apache.maven.jline.FastTerminal.getTerminal(FastTerminal.java:68)
...
at org.jline.terminal.impl.ffm.CLibrary.<clinit>(CLibrary.java:369)
Also seen during startup:
WARNING: Unable to find openpty native method in static libraries and unable to load the util library.
- java.long.UnsatisfiedLinkError: no util in java.library.path: ...
Suspected cause
A startup hang/regression in Maven 4.0.0-rc-6 involving JLine terminal initialization (FFM path) and logging initialization.
The issue does not reproduce in 4.0.0-rc-5 with the same JDK and container.
Workarounds
Any of the following avoids the hang for rc-6 in this environment:
MAVEN_OPTS="-Dorg.jline.terminal.ffm=false"
MAVEN_OPTS="-Dorg.jline.terminal.ffm=false -Dorg.jline.terminal.jni=true"
MAVEN_OPTS="-Dorg.jline.terminal.providers=jni,exec -Dorg.jline.terminal.ffm=false"
Notes
- This is reproducible with
mvn --version only (no project build required).
- Network/download issues were ruled out.
- Wrapper script is not required to reproduce; direct Maven binary invocation shows the same behavior for
rc-6.
Summary
mvn --versionhangs indefinitely with Maven4.0.0-rc-6under JDK 25 in a Linux container environment.The same command works with Maven
4.0.0-rc-5under the same conditions.This appears to be a regression in
rc-6.Environment
openjdk:25-ea-jdk-bullseye4.0.0-rc-5(works)4.0.0-rc-6(hangs)Regression statement
Under the sam eruntime and command line:
apache-maven-4.0.0-rc-5/bin/mvn --batch-mode --errors --show-warnings --versionexits successfullyapache-maven-4.0.0-rc-6/bin/mvn --batch-mode --errors --show-warnings --versionhangs and must be killedReproduction (self-contained, JDK-only)
This script below avoids external package installs and uses only JDK tools available in the image.
Expected result
Both versions print Maven version and exit with code
0.Actual result
rc-5: exits with0rc-6: hangs;timeoutkills process (rc=124from timeout wrapper, process termination observed)Thread dump evidence from rc-6
While hung,
jcmd <pid> Thread.print -lshows:mainthread waiting inCompleteableFuture.get()fromorg.apache.maven.jline.FastTerminal.getTerminalfast-terminal-threadalso waiting in the same pathorg.jline.terminal.impl.ffm.CLibrary)Relevant frames:
Also seen during startup:
Suspected cause
A startup hang/regression in Maven
4.0.0-rc-6involving JLine terminal initialization (FFM path) and logging initialization.The issue does not reproduce in
4.0.0-rc-5with the same JDK and container.Workarounds
Any of the following avoids the hang for
rc-6in this environment:MAVEN_OPTS="-Dorg.jline.terminal.ffm=false"MAVEN_OPTS="-Dorg.jline.terminal.ffm=false -Dorg.jline.terminal.jni=true"MAVEN_OPTS="-Dorg.jline.terminal.providers=jni,exec -Dorg.jline.terminal.ffm=false"Notes
mvn --versiononly (no project build required).rc-6.