
Чистый Go-декомпилятор Java и оператор сериализации
.war.zip.class (пул констант,
поля, методы, версия, флаги доступа).Создан для портативности и встраивания:
javajive оборачивает все три
возможности; подпакеты остаются доступными для продвинутого использования.decompile, classinfo и serial,
построенные на стандартной библиотеке..class / .jar и
сериализованные JDK блобы с помощью javac/java, затем проверяет JavaJive на них
(см. HARNESS-WORKFLOW.md).utils / codec / log / go-funk
переписаны как минимальное, самодостаточное ядро internal/.Полный дифференциальный аудит 38 JAR-файлов фиксирует ноль зарегистрированных регрессий относительно фиксированной базовой линии: все 20 ранее компилируемых без ошибок JAR-файлов сохранены, а 26 теперь компилируются полностью. Дефекты базовой линии и 4 существующих заглушки методов остаются видимыми. См. результаты по каждому JAR и воспроизведение.
250 изолированных семантических круговых прогонов отдельно фиксируют компиляцию, верификацию JVM, заглушки и равенство во время выполнения; оригинальные классы приложения отсутствуют в пересобранных classpath. CI запускает семантический аудит на JDK 17 и 21, полное историческое сравнение, а также матрицы OS/Go и гонок. Эти проверки не доказывают эквивалентность каждого метода библиотеки. См. реализацию и оставшиеся границы.
Следующие показатели были заявлены для v0.3.0 от 2026-09-05. Они не являются результатами приёмки текущей версии или доказательством поведенческой эквивалентности.
Измерено на 34 реальных jar-файлах (18 759 развёрнутых единиц) через декомпиляцию → повторную компиляцию
javac --release 8 → переупаковку → верификацию JVM:
Outer$Inner.java)
перекомпилируются с нулём ошибок javac и 0 синтаксических ошибок во всех 34 jar-файлах (жёсткое утверждение,
принудительно проверяемое в CI, так что ни одна ошибка типа не может скрыться за сбоем лексера).-Xverify:all по каждому классу проходит от начала до конца (кодек побайтово идентичен
оригинальному jar-файлу при дифференциальном сравнении вызовов). Зафиксировано в provenClean.См. BENCHMARK.md для полной методологии, таблиц по каждому jar и команд воспроизведения.
# CLI
go install github.com/yaklang/javajive/cmd/javajive@latest
# Library
go get github.com/yaklang/javajive@latest
Или сборка из исходников:
git clone https://github.com/yaklang/javajive
cd javajive
go build -o javajive ./cmd/javajive
Требуется Go 1.22+.
javajive <command> [arguments]
Commands:
decompile decompile .class/.jar/.war/.zip or a directory into Java source
classinfo print the structure of a .class file (version, fields, methods)
serial Java serialization tools (subcommands: tojson, fromjson)
version print the version
help show help
# Single class: prints to stdout by default, or -o to write a file.
javajive decompile Foo.class
javajive decompile Foo.class -o Foo.java
# Archive: defaults to a "<input>.src" directory, or -o to choose one.
javajive decompile app.jar
javajive decompile app.war -o ./app-src
# Directory: recursively decompile .class files (requires -o output dir).
javajive decompile ./classes -o ./src
javajive classinfo Foo.class
class: InvisibleAnnoSeed
super: java/lang/Object
version: 61.0
access: public
constants: 18
fields (0):
methods (2):
<init>()V
run()I
# Serialized binary -> JSON. (-hex: input is a hex string, -: read from stdin)
javajive serial tojson dump.bin
printf 'aced000574000568656c6c6f' | javajive serial tojson -hex -
# JSON -> serialized binary. (default prints hex; with -o writes raw bytes)
javajive serial fromjson dump.json -o out.bin
javajive serial fromjson dump.json # prints hex
Используйте единый фасадный пакет — один импорт покрывает все три возможности:
import "github.com/yaklang/javajive"
// Decompile a single class, or a whole archive into a directory.
src, err := javajive.Decompile(classBytes)
err = javajive.DecompileArchive("app.jar", "app-src")
// Inspect class structure.
obj, err := javajive.ParseClass(classBytes)
_ = obj.GetClassName()
// Java serialization: binary -> JSON -> binary.
objs, _ := javajive.ParseSerialized(raw) // or ParseSerializedHex(hexStr)
jsonBytes, _ := javajive.SerializedToJSON(objs...)
restored, _ := javajive.SerializedFromJSON(jsonBytes)
out := javajive.MarshalSerialized(restored...)
| Функция | Назначение |
|---|---|
Decompile(classBytes) (string, error) | Декомпилировать байты одного .class |
DecompileFile(path) (string, error) | Декомпилировать один .class с диска |
DecompileWithResolver(classBytes, resolve) | Декомпилировать с резолвером байтов классов |
DecompileArchive(src, dst) error | Декомпилировать .jar/.war/.zip в каталог |
ParseClass(classBytes) (*ClassObject, error) | Разобрать байты одного .class |
ParseClassFile(path) (*ClassObject, error) | Разобрать один .class с диска |
ParseSerialized(raw) ([]JavaSerializable, error) | Разобрать поток сериализации |
ParseSerializedHex(hexStr) ([]JavaSerializable, error) | Разобрать поток в hex-кодировке |
MarshalSerialized(objs...) []byte | Перекодировать объекты в проводной формат |
MarshalSerializedHex(objs...) string | Перекодировать в hex |
SerializedToJSON(objs...) ([]byte, error) | Преобразовать объекты в JSON |
SerializedFromJSON(raw) ([]JavaSerializable, error) | Восстановить объекты из JSON |
Подпакеты также экспортируются для продвинутого использования:
classparser, classparser/jarwar, serialization.
Чтобы оставаться портативным и компактным, JavaJive идёт на несколько намеренных компромиссов по сравнению с yaklang. См. MIGRATE.md для полного сопоставления и руководства по миграции.
| Область | yaklang (upstream) | JavaJive |
|---|---|---|
| Страховочная сеть ANTLR декомпилятора | повторно валидирует выгруженный исходный код через грамматику Java ANTLR; при сбое деградирует члены до заглушек | удалена (тяжёлая зависимость); валидация — no-op, вывод выдаётся напрямую |
Слой поддержки (utils / codec / log / go-funk) | общие пакеты монорепозитория | минимальные самодостаточные реализации в internal/ |
Генератор гаджетов yso | включён | не включён |
Восстановление кодировки строковых литералов (MatchMIMEType) | опциональное восстановление GBK/GB18030 | заглушка (no-op); поведение не меняется в подавляющем большинстве случаев |
Сторонние зависимости ограничены небольшим набором чисто-Go библиотек
(gobwas/glob, go-viper/mapstructure, samber/lo, tidwall/gjson,
segmentio/ksuid, yeka/zip и несколько golang.org/x/*).
go test ./... # unit tests + JDK cross-tests (skipped if no JDK)
go test ./... -race # data-race free (linux)
go test ./test/cross/ -v # Java cross-tests only (needs javac/java on PATH)
Кросс-тесты с JDK компилируют настоящие Java-артефакты во время тестирования и проверяют их
против JavaJive; они автоматически вызывают t.Skip, когда JDK отсутствует. См.
HARNESS-WORKFLOW.md о том, как работают харнесс и CI.
javajive.go unified facade package (import "github.com/yaklang/javajive")
serialization/ Java serialization/deserialization (from yaklang common/yserx)
classparser/ class parser + decompiler (from yaklang common/javaclassparser)
cmd/javajive/ CLI entry point
internal/ trimmed self-contained support layer (log / codec / funk / utils / filesys / ...)
test/cross/ JDK-backed cross-tests (javac/java)
site/ static landing page deployed to GitHub Pages