gnodet opened a new issue, #11819:
URL: https://github.com/apache/maven/issues/11819
## Summary
Maven's current console output is excessively verbose and makes it hard to
find relevant information. In large multi-module builds (100+ modules), users
are overwhelmed with noise — plugin execution banners, download progress lines,
and repetitive separators — while actual warnings and errors get buried.
This proposal redesigns Maven's default console output to be concise,
informative, and modern, inspired by tools like maven-daemon (mvnd), Gradle,
and Cargo.
## Related Issues
- #8571 (MNG-6662): More concise logging — suppress mojo-level output
- #8027 (MNG-7008): Skip reactor logging — error messages buried in huge
reactor output
- #8973 (MNG-7941): Meaning of -ntp vs --batch-mode — cleaner separation of
output controls
- #11088: CI env variable defaults — auto-detect CI and adjust output
- #8976 (MNG-7484): Warning summary at end of build — surface warnings that
get buried
- #7500 (MNG-5932): Per-user/project logging configuration
- #10872 (MNG-8071): Build in parallel by default — output must handle
concurrent modules
## Proposal
### Mode 1: Smart/Rich Terminal Output (default when interactive TTY)
Using JLine (already a dependency), Maven uses a **fixed-bottom status
area** with scrolling log above:
```
✓ my-core 1.2s
✓ my-api 0.8s
Building my-app 2.0.0 [3/12]
✓ maven-clean-plugin:clean 0.1s
✓ maven-resources-plugin:resources 0.3s
● maven-compiler-plugin:compile 1.2s
↓ junit-jupiter-api-5.10.jar 234/512 KB
────────────────────────────────────────────────────────────────────
my-core ✓ my-api ✓ my-utils ✓ my-app ● my-web ⏳ [5/12] 32s
```
Key principles:
- **Fixed status bar** at the bottom showing currently building modules
(parallel-aware), overall progress, elapsed time
- **Compact per-module output** — module name, plugin goals completing
(✓/✗), timing
- **Downloads shown inline** with progress, then cleared when done
- **Warnings/errors always bubble up** — never scrolled away
- **Full log written to `target/build.log`** automatically
### Mode 2: CI/Batch Output (default when `CI` env var set or `--batch-mode`)
```
[INFO] Building my-core 2.0.0 [1/12]
[INFO] Building my-api 2.0.0 [2/12]
[WARN] my-utils: maven-compiler-plugin: source/target 8 is deprecated
[INFO] Building my-app 2.0.0 [4/12]
[ERROR] my-app: maven-compiler-plugin:compile FAILED (1.2s)
── Build Summary ──────────────────────────────────────────────────
my-core ..................... SUCCESS [ 1.2s]
my-api ...................... SUCCESS [ 0.8s]
my-utils .................... SUCCESS [ 2.1s] ⚠ 1 warning
my-app ...................... FAILURE [ 1.2s]
── Warnings ───────────────────────────────────────────────────────
my-utils: source/target 8 is deprecated, use 11+
── Error ──────────────────────────────────────────────────────────
my-app: compilation failure (3 errors)
src/main/java/App.java:42: cannot find symbol
BUILD FAILURE Total: 12.3s
Full log: target/build.log
```
### Mode 3: Verbose (`-X` / `--verbose`)
Same as current Maven output — full scrolling output for debugging.
## Design Choices
1. **Default to less, not more** — most users only care about: what's
building, did it succeed, and if not, what failed
2. **Log file by default** — all `[INFO]`-level plugin output goes to a log
file. Console shows only progress + warnings + errors
3. **Structured warnings/errors at the end** — surfaces warnings that get
buried in hundreds of lines (#8976)
4. **Parallel-aware** — with parallel builds (#10872), the status bar shows
multiple concurrent modules like mvnd does
5. **Progressive disclosure** — `mvn` (concise) → `mvn --verbose` (full mojo
output) → `mvn -X` (debug)
## Implementation Notes
Building blocks already exist in the codebase:
- **JLine** is already a dependency (`maven-jline`)
- **`ExecutionEventLogger`** captures all lifecycle events
- **`ConsoleMavenTransferListener`** does `\r`-based progress
- **`CIDetector`** classes detect CI environments
- **mvnd's `TerminalOutput`** provides a proven reference implementation
The core change: a new `SmartExecutionEventLogger` using JLine's `Display`
API to manage a fixed status region, while delegating full output to a
file-based log writer.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]