A portable Textual TUI toolkit for Java / Spring Boot developers.
JetTUI is a single-window terminal dashboard that bundles the four things Java/Spring Boot developers do every day:
- Start/stop services — launch Spring Boot
*Application.javamain classes with JDWP debug enabled, each service gets its own log tab. - Build & install —
mvn installthe whole project or any single module incrementally, with live Maven log streaming. - Package — scan deployable modules, multi-select, run
mvn packageand report the producedjlcloud-*.jarartifacts (deployment is out of scope). - JDK / Maven switch — press
F4, enter the JDK/Maven home directory, click Activate to switch versions instantly. The change takes effect in the current process and is persisted to user environment variables (JAVA_HOME,MAVEN_HOME,PATH) so new terminals keep the selection (Windows only).
Drop tool_tui/ and run_fast_tui.py into any Maven multi-module project
and it just works — no config file, no hardcoded paths.
AI-assisted development is everywhere now. Anyone can be a full-stack engineer with the help of LLMs — but do we still need to install a pile of heavy IDEs and tooling just to write code?
JetTUI's original intention: uninstall IntelliJ IDEA, keep just VS Code (or any plain editor you like) plus this tiny TUI, and return to a native, lightweight workflow. Build, run, debug Spring Boot services — all from the terminal, no heavyweight IDE required. It turns out, the simple way works just fine.
- Lightweight — replace IDEA with
VSCode + JetTUI; memory drops from 2-4GB to a few hundred MB. - Zero config — no config file; auto-detects all Maven multi-module projects under the directory. Copy and run.
- Mouse-friendly TUI — every action is a click; the keyboard is only an accelerator.
- Env switch — type the path, one-click activate; switch JDK / Maven freely, auto-written to env vars, permanent.
- Log-friendly — start/build/package all stream logs; each launch writes
{svc}_{timestamp}.logfor AI to read and fix bugs. - Debug-ready — JDWP
suspend=nalways on; pair any editor (VSCode/Vim/JetBrains) with JetTUI to debug Spring Boot.
| Component | Version |
|---|---|
| Python | 3.10+ |
textual |
>= 8.2 |
rich |
>= 15.0 |
| Maven | on PATH (mvn / mvn.cmd) |
| JDK | JAVA_HOME set, or java on PATH |
Install Python deps:
pip install textual rich# from the root of any Maven multi-module project
python run_fast_tui.py
# or
python -m tool_tuiTab layout:
| Tab | Hotkey | Purpose |
|---|---|---|
| Service Manager | F1 |
start/stop Spring Boot services with JDWP debug |
| Cache Manager | F2 |
mvn install globally or for a single module |
| Build Manager | F3 |
mvn package selected modules (no deploy) |
| Environment Switch | F4 |
switch JDK / Maven versions (Windows only) |
JetTUI is a TUI — every action is reachable by mouse click: click tabs to switch, click list items to select, click buttons to start/stop/build/package. Keyboard shortcuts exist as accelerators, not requirements.
| Key | Action |
|---|---|
F1 / F2 / F3 / F4 |
switch tab (or click the tab) |
Enter |
confirm the highlighted item |
q |
quit |
your-maven-project/
├── pom.xml ← project root (auto-detected)
├── run_fast_tui.py ← thin entry shell
└── tool_tui/
├── __init__.py
├── __main__.py ← `python -m tool_tui` entry
├── app.py ← ToolApp shell (TabbedContent)
├── common.py ← path detection, mvn/java lookup, classpath
├── service_manager.py ← F1 Service Manager container
├── cache_manager.py ← F2 Cache Manager container
├── build_manager.py ← F3 Build Manager container
└── env_manager.py ← F4 JDK/Maven Environment Switch (Windows only)
Runtime artifacts (auto-created, safe to delete):
log/ ← per-service & per-build logs
├── cp_{svc}.txt ← cached dependency classpath
├── {svc}_{timestamp}.log ← service stdout
└── build_{tag}_{timestamp}.log ← maven build stdout
debug_ports.json ← allocated JDWP ports
Dynamic project root detection (common.py):
The anchor is the directory that contains tool_tui/. From there JetTUI walks
up/down to find the nearest pom.xml, preferring aggregator poms (with
<modules>). This is why the same bundle works in any Maven project layout.
Async scanning (every manager):
The __init__ of each Container only initializes empty data structures, so
instantiation takes <1 ms. on_mount then fires a @work(thread=True) worker
that runs the actual scan (rglob, os.walk, pom parsing) off the UI thread.
When the worker finishes it calls self.app.call_from_thread(self._on_scanned, data)
to marshal the result back to the UI thread, which then populates the ListView.
The first paint is therefore instant and shows a scanning... please wait
message in the log panel.
Provided as-is for internal developer tooling.
- WeChat:
GengMS_DEV - Welcome to follow the WeChat Official Account: 极客悟道