{"id":50686734,"url":"https://github.com/t1/maven-dependency-manager","last_synced_at":"2026-06-08T23:32:30.378Z","repository":{"id":342381592,"uuid":"1170514261","full_name":"t1/maven-dependency-manager","owner":"t1","description":"A Java-based CLI tool to check for and update versions of Maven dependencies across multiple projects, with intelligent caching using the local Maven repository, different output formats, and a Terminal UI.","archived":false,"fork":false,"pushed_at":"2026-06-05T16:28:51.000Z","size":466,"stargazers_count":0,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"trunk","last_synced_at":"2026-06-05T18:10:10.227Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/t1.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-02T07:55:27.000Z","updated_at":"2026-06-05T16:28:53.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/t1/maven-dependency-manager","commit_stats":null,"previous_names":["t1/maven-dependency-manager"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/t1/maven-dependency-manager","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/t1%2Fmaven-dependency-manager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/t1%2Fmaven-dependency-manager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/t1%2Fmaven-dependency-manager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/t1%2Fmaven-dependency-manager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/t1","download_url":"https://codeload.github.com/t1/maven-dependency-manager/tar.gz/refs/heads/trunk","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/t1%2Fmaven-dependency-manager/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34085321,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-08T02:00:07.615Z","response_time":111,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-08T23:32:29.187Z","updated_at":"2026-06-08T23:32:30.371Z","avatar_url":"https://github.com/t1.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Maven Dependency Manager\n\nA Java-based CLI tool to check for newer versions of Maven dependencies across multiple projects, with intelligent\ncaching using the local Maven repository, different output formats, and a Terminal UI (`tui`).\n\nThis is actually my personal playground project\nfor [Level 3 Agentic Development](https://www.codecentric.de/wissens-hub/blog/die-fuenf-level-der-ki-gestuetzten-softwareentwicklung)\nusing Claude Code and [my plugins](https://github.com/t1/tdder).\n\n## Features\n\n- **Dependency Version Checking**: Queries Maven Central for the latest versions of your dependencies\n- **Plugin Version Checking**: Also checks and updates plugin versions\n- **Parent POM Version Checking**: Also checks and updates parent POM versions\n- **Smart Caching**: Leverages the local Maven repository (~/.m2) via Maven Resolver to minimize network requests, with\n  `--force-cache-update` to bypass the cache. The local repo path can be overridden via the `maven.repo.local` system\n  property or the `--local-repo` CLI option.\n- **Multi-Project Support**: Scan single or multiple Maven projects at once, automatically recognize Maven modules\n- **Multiple Output Formats**: JSON, YAML, XML, and human-readable text reports\n- **Show Available Versions**: Query all available versions for a specific artifact by `groupId:artifactId`, `groupId`,\n  or `artifactId` (resolving partial coordinates from your POM), displayed as a tree grouped by major/minor version\n- **Automatic Updates**: Separate update command to update pom.xml files with the latest versions (supports both direct\n  versions and property-based versions, including parent POMs)\n- **Effective Version Detection**: Uses Maven's effective POM to report the currently effective dependency/plugin version,\n  so BOM-managed and parent-managed versions are shown correctly\n- **Parent Property Resolution**: Version properties defined in a parent POM are resolved and updated in the parent\n  when the parent is within the working set of POMs (via parameter or module resolution)\n- **Flexible Version Parsing**: Handles standard [semantic versions](https://semver.org) (`1.2.3`), multi-segment versions (`2.13.4.2`),\n  qualifier suffixes (`1.0-RC1`, `5.1.5.Final`), and timestamp-based build numbers (`0.7.7.201606060606`).\n  Qualifiers are classified as pre-release (`SNAPSHOT`, `alpha`, `beta`, `RC`, `M`, ...) or\n  release (`Final`, `GA`, `RELEASE`, `SP`) to filter out unstable versions.\n  Dependencies already ahead of the latest released version — for example local `-SNAPSHOT` versions on a newer release line — are shown only in `--show-all` mode and are not counted as updates.\n  A `-SNAPSHOT` on the same release line as the latest release is still treated as an upgrade to that release.\n  Note that this is not 100% compatible to Maven's version handling.\n- **Robust Error Handling**: Network failures and malformed metadata are logged but don't halt execution\n\n## Requirements\n\n- Java 25 or higher (with preview features enabled)\n- Maven 3.6+ (for building from source)\n\n## Building\n\n```bash\nmvn clean package\n```\n\nThis creates an executable JAR: `target/maven-dep-manager.jar`\n\n## Usage\n\nThis project uses Java preview features, so you must pass `--enable-preview` when running the JAR:\n\n```bash\njava --enable-preview -jar target/maven-dep-manager.jar \u003ccommand\u003e [options]\n```\n\nTo avoid typing this every time, add a shell alias:\n\n```bash\n# bash (~/.bashrc or ~/.bash_profile)\nalias mdm='java --enable-preview -jar /path/to/maven-dep-manager.jar'\n\n# fish (~/.config/fish/config.fish)\nalias --save mdm 'java --enable-preview -jar /path/to/maven-dep-manager.jar'\n```\n\nThen simply use `mdm check`, `mdm update`, etc.\n\n### Basic Usage\n\n```bash\n# Launch the interactive TUI dashboard (default)\nmdm\n\n# Check current directory's pom.xml\nmdm check\n\n# Check a single project\nmdm check pom.xml\n\n# Check a project directory (looks for pom.xml within)\nmdm check my-project/\n\n# Check multiple projects\nmdm check project1/pom.xml project2/pom.xml\n```\n\nIf a `pom` declares `modules`, those are always included in the scan.\n\n### Output Formats\n\n```bash\n# JSON output\nmdm check pom.xml --json\nmdm check pom.xml --format json\n\n# YAML output\nmdm check pom.xml --yaml\nmdm check pom.xml --format yaml\n\n# XML output\nmdm check pom.xml --xml\nmdm check pom.xml --format xml\n\n# Text output (default)\nmdm check pom.xml --text\nmdm check pom.xml --format text\n\n# Save to file\nmdm check pom.xml --output updates.json\n```\n\n### Advanced Options\n\n```bash\n# Show all dependencies (including up-to-date ones and ones ahead of the latest release)\nmdm check pom.xml --show-all\n\n# Force refresh of all cached Maven metadata\nmdm check pom.xml --force-cache-update\n\n# Enable verbose output with stack traces for exceptions\nmdm check pom.xml --verbose\nmdm check pom.xml -v\n```\n\n### Showing Available Versions\n\n```bash\n# Show all versions for a specific artifact\nmdm show-available org.assertj:assertj-core\n\n# Show versions using just the artifactId (resolved from pom.xml)\nmdm show-available assertj-core\n\n# Show versions using just the groupId (resolved from pom.xml)\nmdm show-available org.assertj\n\n# Specify a different POM file for coordinate resolution\nmdm show-available assertj-core --pom other/pom.xml\n```\n\n### Interactive TUI Dashboard\n\n```bash\n# Launch the interactive TUI for the current directory\nmdm tui\n\n# Launch with specific POM files\nmdm tui project1/pom.xml project2/pom.xml\n\n# Specify custom build goals\nmdm tui --build-goals \"clean install\"\n\n# Force cache refresh on startup\nmdm tui --force-cache-update\n```\n\nThe TUI provides a full interactive dashboard where you can:\n\n- Browse dependencies and plugins, grouped by POM and scope in the table; navigate with arrows, Home/End, and Page Up/Page Down. Plugins use profile sub-groups only when present. When you move back up to the first item of a group, its POM/scope header scrolls back into view. Managed consumers are marked as `\u003cmanaged\u003e` (or `\u003cmanaged ↑\u003e` when their upstream management row is also in the scan) and can jump to that upstream row with `u`. These managed consumer rows are informational by default: they are shown without suggested-update checkbox/color, but you can still pick a version explicitly to add a local override. When the upstream management row changes, their effective `Update` \"from\" value follows that upstream version. The header shows the root project name(s), falling back to artifactId(s)\n- Select/deselect suggested updates with checkboxes (`Space` toggles the focused row when it has a checkbox; `a` for all, `n` for none) — POM is updated automatically\n- Pick specific target versions (Enter to open version picker), also downgrades — including managed consumer rows, where confirming a version adds a local `\u003cversion\u003e` override instead of changing an existing one. A picked version applies only to the focused row in its POM, except when several rows in that same POM intentionally share one version property. The picker keeps current, committed, and locally known versions, preselects the current version, and shows their sources (e.g. `central`, `local`) — POM is updated on confirm\n- Jump from a managed consumer to its upstream management row with `u`\n- Run a Maven build and see output in a separate tab (`b`)\n- Rescan after manually applying updates (`r`)\n- Switch between tabs (Tab/`]`/Right forward, Shift-Tab/`[`/Left backward, `p` for Plugins, `d` for Diff/Dependencies, `m` for Messages)\n- View scan errors and warnings inline below the dependency table\n- Quit (`q` or `Esc`)\n\n### Updating Dependencies\n\n```bash\n# Update current directory's pom.xml (default) (alias: \"up\")\nmdm update\n\n# Update pom.xml files with latest versions\nmdm update pom.xml\n\n# Update multiple projects\nmdm update project1/pom.xml project2/pom.xml\n\n# Update only specific dependencies (by groupId:artifactId, groupId, or artifactId)\nmdm update --only org.assertj:assertj-core\nmdm update --only org.assertj\nmdm update --only assertj-core\nmdm update --only org.assertj:assertj-core org.junit.jupiter\n\n# Managed dependencies/plugins are overridden locally if they have no local \u003cversion\u003e\nmdm update pom.xml --only org.junit.jupiter:junit-jupiter\n\n# Only apply patch updates\nmdm update --patch\n\n# Only apply patch and minor updates (no major)\nmdm update --minor\n\n# Update with JSON output\nmdm update pom.xml --format json\n\n# Update and save report to file\nmdm update pom.xml --output updates.json\n```\n\n## Output Examples\n\n### JSON Output\n\n```json\n{\n  \"projects\": [\n    {\n      \"pomFile\": \"/path/to/pom.xml\",\n      \"dependencies\": [\n        {\n          \"groupId\": \"org.springframework.boot\",\n          \"artifactId\": \"spring-boot-starter-web\",\n          \"effectiveVersion\": \"3.1.0\",\n          \"latestVersion\": \"3.2.1\",\n          \"versionStatus\": \"upgradeAvailable\",\n          \"updateType\": \"minor\",\n          \"availableVersions\": [\"3.1.1\", \"3.1.5\", \"3.2.0\", \"3.2.1\"]\n        }\n      ]\n    }\n  ],\n  \"summary\": {\n    \"totalDependencies\": 3,\n    \"outdatedDependencies\": 3,\n    \"majorUpdates\": 0,\n    \"minorUpdates\": 2,\n    \"patchUpdates\": 1\n  }\n}\n```\n\n### Text Output\n\n```\nMaven Dependency Update Report\n==============================\n\nProject: /path/to/pom.xml\n\nOutdated Dependencies (3):\n┌─────────┬──────────────────────────┬─────────────────────────┬──────────┬─────────────────┐\n│ Scope   │ Group ID                 │ Artifact ID             │ Declared │ Update          │\n├─────────┼──────────────────────────┼─────────────────────────┼──────────┼─────────────────┤\n│ compile │ org.springframework.boot │ spring-boot-starter-web │ 3.1.0    │ 3.1.0 → 3.2.1   │\n│ compile │ com.fasterxml.jackson    │ jackson-databind        │ 2.15.0   │ 2.15.0 → 2.16.1 │\n│ test    │ org.junit.jupiter        │ junit-jupiter           │ 5.10.0   │ 5.10.0 → 5.10.1 │\n└─────────┴──────────────────────────┴─────────────────────────┴──────────┴─────────────────┘\n\nSummary: 3 updates available (0 major, 2 minor, 1 patch)\n```\n\n## Development\n\nThis project was developed using Test-Driven Development (TDD) with strict Red-Green-Refactor cycles.\n\n### Running Tests\n\nTo run *all* test, i.e. unit *and* ITs: `mvn verify`\n\nTo run all unit tests (but not the ITs): `mvn test`\nTo run a specific unit test class: `mvn test -Dtest=VersionTest`\nTo run a specific unit test method: `mvn test -Dtest=\"DependencyTest#shouldFormatPluginDependencyToString\"`\n\nTo run all unit tests: `mvn verify -Dskip.surefire.tests`\nTo run a specific integration test class (but no unit test): `mvn verify -Dskip.surefire.tests -Dit.test=CheckCommandIT`\nTo run a specific integration test method (but no unit test):\n`mvn -Dskip.surefire.tests -Dit.test=\"CheckCommandIT#shouldHandlePropertyBasedVersions\"`\n**IMPORTANT** note the quotes in some of these commands, as this string contains a `#` character!\n\nManaged dependencies and plugins are reported with their Maven-effective current version.\nHuman-readable outputs and the TUI merge local git/POM state into a `Declared` column and merge effective/latest information into an `Update` column.\nWhen declared and effective versions are the same, `Update` shows only the target version; otherwise it shows `current → target`.\nWhen you update one that has no local `\u003cversion\u003e`, the tool adds a local explicit version override to the current `pom.xml`.\n\nAt the moment, effective-version detection uses Maven's default profile activation context for the current environment;\nexplicit profile selection is not implemented yet.\n\n### Code Style\n\nThis project uses the **tdder** plugin for TDD, Clean Code, Java, and Maven conventions.\nSee `CLAUDE.md` for details.\n\n## License\n\n[Apache License 2.0](LICENSE.md)\n\n## Contributing\n\nContributions welcome! Please ensure all tests pass before submitting a PR.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ft1%2Fmaven-dependency-manager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ft1%2Fmaven-dependency-manager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ft1%2Fmaven-dependency-manager/lists"}