java-debugging-jdwp-client 0.20.0

JDWP protocol client for Java debugging — implementation detail of jdwp-mcp, not a supported API
Documentation
[package]
# NOT `jdwp-client`, and the reason is a fact about crates.io rather than a preference: that name was
# registered on 2025-09-10 by <https://github.com/bonk-dev/jdwp-client>, an unrelated project. It is the
# same collision `scripts/semver-check.sh` was written around — there it makes the default baseline answer
# from a stranger's package, here it makes the name simply unavailable. Prefixed with the repository name
# so a searcher who finds the crate finds this project.
#
# `[lib] name` below keeps the RUST path `jdwp_client`, so this rename touches no source file. The two
# names are independent on purpose: the registry name has to be globally unique, the import path only has
# to be unique within a dependency graph.
name = "java-debugging-jdwp-client"
version.workspace = true
edition.workspace = true
authors.workspace = true
license.workspace = true
rust-version.workspace = true
# The description is the one line a stranger reads in crates.io search results, before any decision to
# click, so the "not a supported API" part belongs in it rather than only on the docs.rs front page.
description = "JDWP protocol client for Java debugging — implementation detail of jdwp-mcp, not a supported API"
repository.workspace = true
# NOT `readme.workspace = true`, which is the root README.md — an install-and-configure guide for the
# jdwp-mcp MCP server. crates.io renders the readme as the crate's landing page, so inheriting it would
# greet someone who found the *library* with instructions for adding a debugger to Claude Code, which
# contradicts the sentence directly above it.
readme = "README.md"
keywords.workspace = true
categories.workspace = true

# Without this the lib target would be named after the package and every `use jdwp_client::...` in both
# crates would have to become `use java_debugging_jdwp_client::...`.
[lib]
name = "jdwp_client"
path = "src/lib.rs"

[dependencies]
serde.workspace = true
tokio.workspace = true
thiserror.workspace = true
tracing.workspace = true
bytes.workspace = true

[dev-dependencies]
tracing-subscriber.workspace = true
# `test-util` is not part of tokio's "full", and the event loop's reply budget is 30s. Paused time lets
# that budget be asserted on at its real value instead of either waiting it out or reaching for
# `Instant::now() - 30s`, which underflows on a freshly started runtime.
tokio = { workspace = true, features = ["test-util"] }

[[example]]
name = "probe_heap_queries"
path = "examples/probe_heap_queries.rs"

# EVERY `../examples/` target below is silently dropped from the published `.crate`, because `cargo
# package` copies nothing from outside the package root. It warns once per target and packages anyway —
# twelve lines of `warning: ignoring example ... as ... is not included in the published package`, which
# scroll past looking like a lint. That is the intended outcome, not a defect to fix: these are manual
# probes you point at a live JVM, they are useless to someone consuming the library from crates.io, and
# `cargo test` locally still builds them because a local build reads this manifest rather than a tarball.
# Recorded here so the warnings are recognised rather than re-investigated at the one moment — a release —
# when nobody has time to.
[[example]]
name = "test_connection"
path = "../examples/test_connection.rs"

[[example]]
name = "test_vm_commands"
path = "../examples/test_vm_commands.rs"

[[example]]
name = "test_find_class"
path = "../examples/test_find_class.rs"

[[example]]
name = "test_breakpoint"
path = "../examples/test_breakpoint.rs"

[[example]]
name = "test_stack_inspection"
path = "../examples/test_stack_inspection.rs"

[[example]]
name = "test_manual_stack"
path = "../examples/test_manual_stack.rs"

[[example]]
name = "test_string_values"
path = "../examples/test_string_values.rs"

[[example]]
name = "test_static_field"
path = "../examples/test_static_field.rs"

[[example]]
name = "test_deferred_bp"
path = "../examples/test_deferred_bp.rs"

[[example]]
name = "test_exception_bp"
path = "../examples/test_exception_bp.rs"

[[example]]
name = "test_set_field"
path = "../examples/test_set_field.rs"

[[example]]
name = "test_trace_bp"
path = "../examples/test_trace_bp.rs"