Skip to main content

Java Dependency Analyzer is a tool that inspects dependencies.

Project description

Java Dependency Analyzer 1.2.0

A Python CLI tool that inspects Java dependency hierarchies in Maven and Gradle projects and reports known vulnerabilities.

Prerequisites

Installation

Clone the repository and install all dependencies:

git clone <repository-url>
cd java-dependency-analyzer
poetry install

Usage

jda <COMMAND> [OPTIONS] [FILE]

COMMAND is one of gradle or maven.

gradle

jda gradle [OPTIONS] [FILE]

FILE is the path to a build.gradle or build.gradle.kts file. Omit FILE when supplying --dependencies.

maven

jda maven [OPTIONS] [FILE]

FILE is the path to a pom.xml file. Omit FILE when supplying --dependencies.

Options (both subcommands)

Option Short Default Description
--dependencies -d Path to a pre-resolved dependency tree text file (see below). When supplied, parsing and transitive resolution are skipped.
--output-format -f all Report format: json, html, or all (both).
--output-dir -o . Directory to write the report file(s) into.
--no-transitive false Skip transitive dependency resolution; analyse direct dependencies only.
--verbose -v false Print progress messages to the console.
--rebuild-cache false Delete the vulnerability cache before scanning.
--cache-ttl 7 Cache TTL in days. Set to 0 to disable caching.

Exit Codes

Code Meaning
0 Scan completed successfully; no vulnerabilities found.
10 Scan completed successfully; at least one vulnerability was detected.

Pre-resolved dependency trees (--dependencies)

When a Gradle or Maven project already has a dependency tree available (e.g. from CI), you can pass it directly to skip the parser and transitive resolver:

  • Gradle: generate with gradle dependencies --configuration runtimeClasspath > gradle.txt
  • Maven: generate with mvn dependency:tree -Dscope=runtime > maven.txt

The report will reflect the exact tree from the file, including all transitive dependencies.

Examples

Analyse a Maven POM and produce both JSON and HTML reports in the current directory:

jda maven pom.xml

Analyse a Gradle build file and write only an HTML report to ./reports/:

jda gradle build.gradle -f html -o reports/

Analyse direct dependencies only, with verbose output:

jda gradle build.gradle.kts --no-transitive -v

Scan using a pre-resolved Gradle dependency tree (skips transitive resolution):

jda gradle --dependencies runtime.txt -f json -o reports/

Scan using a pre-resolved Maven dependency tree (skips transitive resolution):

jda maven --dependencies maven.txt -f json -o reports/

Configuration

Environment Variable Required Description
GITHUB_TOKEN No A GitHub personal access token. When set, the GhsaScanner uses it to authenticate requests to the GitHub Advisory Database REST API, which significantly increases the rate limit (from ~60 unauthenticated requests/hour to 5 000 authenticated requests/hour). Without it, scans with many dependencies may trigger HTTP 403/429 responses and fall back to the OSV.dev API.

Set it in your shell or in a .env file in the working directory before running jda:

# shell
export GITHUB_TOKEN=ghp_yourTokenHere

# or in .env
GITHUB_TOKEN=ghp_yourTokenHere

Logging

The tool writes logs to java_dependency_analyzer.log in the current working directory, in addition to printing them to the console (stderr).

Logging requires a logging.ini file to be present in the working directory or any of its parent directories. The logger walks up the directory tree until it finds one.

When installed via pip, no logging.ini is bundled. Without it the tool falls back to console-only logging (no log file is created). To enable file logging, copy logging.ini from the repository to your working directory:

curl -O https://raw.githubusercontent.com/rcw3bb/java-dependency-analyzer/master/logging.ini

Then run jda from that same directory.

Architecture

graph TD
    CLI["jda CLI (cli.py)"] --> Parser["DependencyParser (ABC)"]
    Parser --> MavenParser
    Parser --> GradleParser
    Parser --> MavenDepTreeParser
    Parser --> GradleDepTreeParser
    CLI --> Resolver["TransitiveResolver<br/>(Maven Central)"]
    CLI --> Scanner["VulnerabilityScanner (ABC)"]
    Scanner --> OsvScanner["OsvScanner<br/>(OSV.dev API)"]
    Scanner --> GhsaScanner["GhsaScanner<br/>(GitHub Advisory DB)"]
    OsvScanner --> Cache["VulnerabilityCache<br/>(SQLite)"]
    GhsaScanner --> Cache
    CLI --> Reporter["Reporter (ABC)"]
    Reporter --> JsonReporter
    Reporter --> HtmlReporter
    MavenParser --> Dependency["Dependency / Vulnerability<br/>Dataclasses"]
    GradleParser --> Dependency
    MavenDepTreeParser --> Dependency
    GradleDepTreeParser --> Dependency
    Resolver --> Dependency
    OsvScanner --> Dependency
    GhsaScanner --> Dependency
    JsonReporter --> ScanResult["ScanResult"]
    HtmlReporter --> ScanResult
    Dependency --> ScanResult

Components

Component Location Responsibility
CLI java_dependency_analyzer/cli.py Entry point (gradle / maven subcommands); orchestrates parsing, resolving, scanning, and reporting.
MavenParser parsers/maven_parser.py Parses pom.xml, resolves ${property} placeholders, filters by runtime scope.
GradleParser parsers/gradle_parser.py Parses Groovy DSL (build.gradle) and Kotlin DSL (build.gradle.kts) files.
MavenDepTreeParser parsers/maven_dep_tree_parser.py Parses mvn dependency:tree text output into a full dependency tree.
GradleDepTreeParser parsers/gradle_dep_tree_parser.py Parses gradle dependencies text output into a full dependency tree.
TransitiveResolver resolvers/transitive.py Fetches transitive dependencies by downloading POM files from Maven Central.
OsvScanner scanners/osv_scanner.py Queries the OSV.dev batch API for known CVEs.
GhsaScanner scanners/ghsa_scanner.py Queries the GitHub Advisory Database REST API for security advisories; automatically falls back to OSV when rate-limited (HTTP 403/429).
VulnerabilityCache cache/vulnerability_cache.py SQLite-backed cache for raw vulnerability API payloads with configurable TTL.
DatabaseManager cache/db.py Manages SQLite connection lifecycle and schema initialisation.
JsonReporter reporters/json_reporter.py Writes a ScanResult to a JSON file.
HtmlReporter reporters/html_reporter.py Renders a ScanResult to a styled HTML report via a Jinja2 template.

Development Setup

Install all dependencies (including dev tools):

poetry install

Running Tests

Run the full test suite with coverage and generate an HTML report:

poetry run pytest --cov=java_dependency_analyzer tests --cov-report html

Code Quality

Format and lint the source code (linter must score 10/10):

poetry run black java_dependency_analyzer
poetry run pylint java_dependency_analyzer

Publishing to PyPI

Prerequisites

  • A PyPI account with an API token.

Configure the token

poetry config pypi-token.pypi <your-token>

Build and publish

poetry publish --build

This builds the source distribution and wheel, then uploads them to PyPI in one step.

Note: PyPI releases are immutable. Once a version is published, it cannot be overwritten.
To fix a mistake, yank the release via the PyPI web UI and publish a new version.

Changelog

Author

Ron Webb <ron@ronella.xyz>

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

java_dependency_analyzer-1.2.0.tar.gz (30.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

java_dependency_analyzer-1.2.0-py3-none-any.whl (44.0 kB view details)

Uploaded Python 3

File details

Details for the file java_dependency_analyzer-1.2.0.tar.gz.

File metadata

  • Download URL: java_dependency_analyzer-1.2.0.tar.gz
  • Upload date:
  • Size: 30.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.3.3 CPython/3.14.2 Windows/11

File hashes

Hashes for java_dependency_analyzer-1.2.0.tar.gz
Algorithm Hash digest
SHA256 7d72ee9367897da1a6d7e48461e7cda6bd45606c6e26098258f90721cbed4029
MD5 3d18487b8630430f5cceb40e21920243
BLAKE2b-256 531fae1335e1c7834f51ce3d02c527701dfcea9ab1c10f9226a9e572a80da1ae

See more details on using hashes here.

File details

Details for the file java_dependency_analyzer-1.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for java_dependency_analyzer-1.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e9a340f3fb3ceaf34dac0fa9205e071edd95b437f527f6b110292154fa532ce2
MD5 406b21d4e0e3f3ef1542140984f75ead
BLAKE2b-256 3db63d3d8df3183ef131c6066c4ae8c3c9022b5d3467e95d05e844ab8ded6cf8

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page