Delta Coverage CLI

January 25, 2026 ยท View on GitHub

A standalone command-line interface for running delta coverage analysis without requiring the Gradle plugin. This is useful for CI/CD pipelines where you cannot inject the Gradle plugin into build scripts.

Installation

Download the latest JAR from Maven Central or GitHub Releases.

# Download from Maven Central
curl -L -o delta-coverage-cli.jar \
  https://repo1.maven.org/maven2/io/github/gw-kit/delta-coverage-cli/3.6.0/delta-coverage-cli-3.6.0.jar

Quick Start

# Generate diff file
git diff origin/main...HEAD > changes.diff

# Run delta coverage
java -jar delta-coverage-cli.jar \
  --engine JACOCO \
  --diff-file changes.diff \
  --coverage-binary build/jacoco/test.exec \
  --classes build/classes/java/main \
  --sources src/main/java \
  --html --console

Usage

Usage: delta-coverage [-hvV] [--console] [--fail-on-violation]
                      [--full-coverage] [--html] [--markdown] [--xml]
                      [-c=<configFile>] [-e=<engine>] [-f=<diffFile>]
                      [--min-coverage=<minCoverage>] [-o=<reportDir>]
                      [--view-name=<viewName>] [--classes=<classRoots>...]
                      [--coverage-binary=<coverageBinaryFiles>...]
                      [--exclude=<excludeClasses>...] [-s=<sourceFiles>...]

Computes code coverage of new/modified code based on a provided diff.

Options:
  -c, --config=<configFile>     Path to configuration file (YAML or JSON)
  -e, --engine=<engine>         Coverage engine: JACOCO or INTELLIJ
  -f, --diff-file=<diffFile>    Path to diff file
      --coverage-binary=<files> Coverage binary files or glob pattern
      --classes=<dirs>          Class directories or glob pattern
  -s, --sources=<dirs>          Source directories (comma-separated or glob)
      --exclude=<patterns>      Class exclusion patterns (comma-separated)
  -o, --report-dir=<dir>        Output directory for reports
      --html                    Generate HTML report
      --xml                     Generate XML report
      --console                 Generate console report
      --markdown                Generate markdown report
      --full-coverage           Include full coverage in reports
      --min-coverage=<ratio>    Minimum coverage ratio (0.0-1.0)
      --fail-on-violation       Exit with error if coverage below threshold
      --view-name=<name>        Name for the coverage view
  -v, --verbose                 Enable verbose output
  -V, --version                 Print version information
  -h, --help                    Show help message

Glob Pattern Support

File arguments support glob patterns for automatic file discovery:

java -jar delta-coverage-cli.jar \
  --engine JACOCO \
  --diff-file changes.diff \
  --coverage-binary 'build/**/jacoco/*.exec' \
  --classes 'build/classes/**/main' \
  --sources 'src/main/java,src/main/kotlin' \
  --html --console

Configuration File

For complex configurations, use a YAML or JSON file.

YAML Format

# delta-coverage.yaml
coverageEngine: JACOCO
viewName: cli-run
diffSourceFile: changes.diff
coverageBinaryFiles:
  - build/jacoco/test.exec
  - "build/**/jacoco/*.exec"  # Glob patterns supported
classRoots:
  - build/classes/java/main
sourceFiles:
  - src/main/java
  - src/main/kotlin
excludeClasses:
  - "**/*Test*"
reports:
  reportDir: build/reports/delta-coverage
  html: true
  xml: false
  console: true
  markdown: false
  fullCoverage: false
violationRules:
  minCoverage: 0.8
  failOnViolation: true

JSON Format

{
  "coverageEngine": "JACOCO",
  "viewName": "cli-run",
  "diffSourceFile": "changes.diff",
  "coverageBinaryFiles": [
    "build/jacoco/test.exec",
    "build/**/jacoco/*.exec"
  ],
  "classRoots": ["build/classes/java/main"],
  "sourceFiles": ["src/main/java", "src/main/kotlin"],
  "excludeClasses": ["**/*Test*"],
  "reports": {
    "reportDir": "build/reports/delta-coverage",
    "html": true,
    "xml": false,
    "console": true,
    "markdown": false,
    "fullCoverage": false
  },
  "violationRules": {
    "minCoverage": 0.8,
    "failOnViolation": true
  }
}

Running with Config File

java -jar delta-coverage-cli.jar --config delta-coverage.yaml
# or
java -jar delta-coverage-cli.jar --config delta-coverage.json

Override config file values with CLI arguments:

java -jar delta-coverage-cli.jar --config delta-coverage.yaml --diff-file pr.diff

Exit Codes

CodeMeaning
0Success
1Coverage violation (when --fail-on-violation is set)
2Configuration error (missing required arguments)
3Runtime error

CI/CD Examples

GitHub Actions

jobs:
  coverage:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Set up JDK
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'

      - name: Build and test
        run: ./gradlew build

      - name: Generate diff
        run: git diff origin/${{ github.base_ref }}...HEAD > changes.diff

      - name: Download Delta Coverage CLI
        run: |
          curl -L -o delta-coverage-cli.jar \
            https://repo1.maven.org/maven2/io/github/gw-kit/delta-coverage-cli/3.6.0/delta-coverage-cli-3.6.0.jar

      - name: Run Delta Coverage
        run: |
          java -jar delta-coverage-cli.jar \
            --engine JACOCO \
            --diff-file changes.diff \
            --coverage-binary 'build/**/jacoco/*.exec' \
            --classes 'build/classes/**/main' \
            --sources src/main/java \
            --html --console \
            --min-coverage 0.8 \
            --fail-on-violation

      - name: Upload coverage report
        uses: actions/upload-artifact@v4
        if: always()
        with:
          name: delta-coverage-report
          path: build/reports/delta-coverage

Azure DevOps

trigger:
  - main

pool:
  vmImage: 'ubuntu-latest'

steps:
  - task: JavaToolInstaller@0
    inputs:
      versionSpec: '17'
      jdkArchitectureOption: 'x64'
      jdkSourceOption: 'PreInstalled'

  - script: ./gradlew build
    displayName: 'Build and test'

  - script: git diff origin/main...HEAD > changes.diff
    displayName: 'Generate diff'

  - script: |
      curl -L -o delta-coverage-cli.jar \
        https://repo1.maven.org/maven2/io/github/gw-kit/delta-coverage-cli/3.6.0/delta-coverage-cli-3.6.0.jar
      java -jar delta-coverage-cli.jar \
        --engine JACOCO \
        --diff-file changes.diff \
        --coverage-binary '$(Build.SourcesDirectory)/build/**/jacoco/*.exec' \
        --classes '$(Build.SourcesDirectory)/build/classes/**/main' \
        --sources $(Build.SourcesDirectory)/src/main/java \
        --report-dir $(Build.ArtifactStagingDirectory)/delta-coverage \
        --html --console \
        --fail-on-violation
    displayName: 'Run Delta Coverage'

  - task: PublishBuildArtifacts@1
    condition: always()
    inputs:
      pathToPublish: '$(Build.ArtifactStagingDirectory)/delta-coverage'
      artifactName: 'delta-coverage-report'

GitLab CI

delta-coverage:
  stage: test
  image: eclipse-temurin:17-jdk
  script:
    - ./gradlew build
    - git diff origin/main...HEAD > changes.diff
    - |
      curl -L -o delta-coverage-cli.jar \
        https://repo1.maven.org/maven2/io/github/gw-kit/delta-coverage-cli/3.6.0/delta-coverage-cli-3.6.0.jar
    - |
      java -jar delta-coverage-cli.jar \
        --engine JACOCO \
        --diff-file changes.diff \
        --coverage-binary 'build/**/jacoco/*.exec' \
        --classes 'build/classes/**/main' \
        --sources src/main/java \
        --html --console \
        --min-coverage 0.8 \
        --fail-on-violation
  artifacts:
    when: always
    paths:
      - build/reports/delta-coverage
    expire_in: 1 week

Building from Source

# Clone the repository
git clone https://github.com/gw-kit/delta-coverage-plugin.git
cd delta-coverage-plugin

# Build the CLI JAR
./gradlew :delta-coverage-cli:shadowJar

# The JAR is located at:
# delta-coverage-cli/build/libs/delta-coverage-cli-<version>.jar