Supercharge your AI-assisted Java development

Code → Test → Debug
Built for Claude

Tired of approving find ~/.m2 searches?
Sick of extracting jars to /tmp?
Done approving javap for every class?
Wasting time adding and removing System.out.println?

Index

Find any class in any jar — project dependencies or ~/.m2. Search by name, the right version appears automatically.

Eliminates: find ~/.m2 ls jar tf

Claude searches manifests with Grep. No permission prompts ever.

Decompile

Read decompiled source for any dependency. Entire jars cached as .java files on demand. One command, then direct file reads.

Eliminates: jar xf javap extracting to /tmp

Claude reads .java files directly. No extraction, no approvals needed.

Instrument

Inject debug bytecode into dependencies while keeping your ~/.m2 clean. Args, return values, exceptions, timing — one JSON line per call.

Eliminates: System.out.println debug code, temp commits

Structured JSON Claude can parse. Return values go straight into assertEquals.

$ mvn jackknife:index \
    -Dclass=com.fasterxml.jackson.databind.ObjectMapper

Found com.fasterxml.jackson.databind.ObjectMapper
  in com.fasterxml.jackson.core:jackson-databind:2.20.1
  Indexed jackson-databind-2.20.1.jar

Find anything in your local repo

No more find ~/.m2, jar tf, jar xf, javap. One command finds the class, picks the latest version, indexes the jar. Search manifests with Grep — no permission prompts.

Exploring dependencies →
$ mvn jackknife:decompile \
    -Dclass=com.fasterxml.jackson.databind.ObjectMapper

Decompiling com.fasterxml.jackson.core:jackson-databind-2.20.1.jar
Decompiled 1247 classes to .jackknife/source/

$ Read .jackknife/source/com.fasterxml.jackson.core/
    jackson-databind-2.20.1/com/fasterxml/jackson/
    databind/ObjectMapper.java

Decompile entire jars instantly

Every class in the jar is decompiled with Vineflower and written as a .java file. Cached for instant re-reads. Claude reads the files directly — no extraction to /tmp, no approvals.

Reading source →
$ mvn jackknife:instrument \
    -Dclass=org.tomitribe.util.Join \
    -Dmethod=join

$ mvn test

Instrument, then test

Pick a class and method. Jackknife injects debug bytecode — your source stays untouched, your ~/.m2 stays clean. Run your tests normally and the debug output appears.

Learn about instrumentation →
JACKKNIFE {"event":"call","time":"12.3us",
  "class":"Join","method":"join",
  "args":[", ",["x","y","z"]],
  "return":"x, y, z"}

JACKKNIFE {"event":"call","time":"0.1ms",
  "class":"Join","method":"join",
  "args":["bad"],
  "exception":{"type":"IllegalArgumentException",
    "message":"bad input"}}

Structured JSON, one line per call

Every instrumented call produces one JACKKNIFE-prefixed JSON line. Args, return values, exceptions, timing. Grep for failures. Copy return values straight into assertEquals.

Output format reference →
## Jackknife
- When you need to inspect, decompile, or
  find classes in jar dependencies, run
  `mvn jackknife:index` in the project.
  This generates `.jackknife/USAGE.md`
  with full instructions.
  Read that file — it has everything
  you need.

Add to your CLAUDE.md

Drop this in your ~/.claude/CLAUDE.md and every Claude session knows how to use Jackknife. No skill to install, no plugin to configure. Claude reads the generated USAGE.md and takes it from there.

Getting started guide →
<!-- ~/.m2/settings.xml -->
<settings>
  <pluginGroups>
    <pluginGroup>org.tomitribe.jackknife</pluginGroup>
  </pluginGroups>
  <profiles>
    <profile>
      <id>jackknife</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <pluginRepositories>
        <pluginRepository>
          <id>central</id>
          <url>https://repo.maven.apache.org/maven2</url>
        </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>
</settings>

Use everywhere

Add Jackknife to your ~/.m2/settings.xml once and it's available in every Maven project. No per-project pom.xml changes needed. Just run mvn jackknife:index in any project.

All state lives in .jackknife/ at the project root — add it to .gitignore. Nothing touches your source, your jars, or your repo.

Installation guide →

Explore the docs