
शुद्ध-Go जावा डीकंपाइलर और सीरियलाइज़ेशन ऑपरेटर
.war.zip.class फ़ाइल की संरचना का निरीक्षण करें (constant pool,
fields, methods, version, access flags)।पोर्टेबिलिटी और embedding के लिए बनाया गया:
javajive facade package तीनों
क्षमताओं को समाहित करता है; उन्नत उपयोग के लिए sub-packages उपलब्ध रहते हैं।decompile, classinfo, और serial subcommands,
standard library पर आधारित।.class / .jar और
JDK-serialized blobs को javac/java से compile करता है, फिर JavaJive को उनके विरुद्ध सत्यापित करता है
(देखें HARNESS-WORKFLOW.md)।utils / codec / log / go-funk को
एक न्यूनतम, स्व-निहित internal/ core के रूप में पुनः कार्यान्वित किया गया है।पूर्ण 38-JAR differential audit शून्य दर्ज regressions की रिपोर्ट करता है निर्धारित baseline के विरुद्ध: पहले से compile-clean सभी 20 JARs बरकरार हैं और 26 अब पूर्ण रूप से compile होते हैं। Baseline दोष और 4 मौजूदा method stubs दृश्यमान बने हुए हैं। देखें per-JAR परिणाम और पुनरुत्पादन।
250 पृथक semantic round trips compilation, JVM verification, stubs और runtime समानता को अलग-अलग दर्ज करते हैं; मूल application classes पुनर्निर्मित classpaths में अनुपस्थित हैं। CI JDK 17 और 21 पर semantic audit, पूर्ण ऐतिहासिक तुलना, तथा OS/Go और race matrices चलाता है। ये जाँचें प्रत्येक library method की समतुल्यता सिद्ध नहीं करतीं। देखें कार्यान्वयन और शेष सीमाएँ।
निम्नलिखित आँकड़े 2026-09-05 को v0.3.0 के लिए रिपोर्ट किए गए थे। ये वर्तमान-संस्करण के स्वीकृति परिणाम या व्यवहारिक समतुल्यता का प्रमाण नहीं हैं।
34 वास्तविक jars (18,759 flattened units) पर decompile → javac --release 8
recompile → repackage → JVM verify के माध्यम से मापा गया:
Outer$Inner.java)
शून्य javac errors के साथ recompile होते हैं, और सभी 34 jars में 0 syntax errors (एक CI-प्रवर्तित
hard assertion, ताकि कोई type error lexer विफलता के पीछे न छिप सके)।-Xverify:all per-class verification end-to-end पास होती है (codec call differential के अंतर्गत
मूल jar के byte-identical है)। provenClean में लॉक किया गया।पूर्ण कार्यप्रणाली, per-jar तालिकाओं और पुनरुत्पादन कमांड के लिए देखें BENCHMARK.md।
# CLI
go install github.com/yaklang/javajive/cmd/javajive@latest
# Library
go get github.com/yaklang/javajive@latest
या स्रोत से build करें:
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
एकीकृत facade package का उपयोग करें — एक import तीनों क्षमताओं को कवर करता है:
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...)
| Function | Purpose |
|---|---|
Decompile(classBytes) (string, error) | एक .class के bytes को decompile करें |
DecompileFile(path) (string, error) | डिस्क से एक .class को decompile करें |
DecompileWithResolver(classBytes, resolve) | class-bytes resolver के साथ decompile करें |
DecompileArchive(src, dst) error | एक .jar/.war/.zip को एक directory में decompile करें |
ParseClass(classBytes) (*ClassObject, error) | एक .class के bytes को parse करें |
ParseClassFile(path) (*ClassObject, error) | डिस्क से एक .class को parse करें |
ParseSerialized(raw) ([]JavaSerializable, error) | एक serialization stream को parse करें |
ParseSerializedHex(hexStr) ([]JavaSerializable, error) | एक hex-encoded stream को parse करें |
MarshalSerialized(objs...) []byte | objects को wire format में पुनः encode करें |
MarshalSerializedHex(objs...) string | hex में पुनः encode करें |
SerializedToJSON(objs...) ([]byte, error) | objects को JSON में परिवर्तित करें |
SerializedFromJSON(raw) ([]JavaSerializable, error) | JSON से objects को पुनर्निर्मित करें |
उन्नत उपयोग के लिए sub-packages भी exported हैं:
classparser, classparser/jarwar, serialization.
पोर्टेबल और छोटा बने रहने के लिए, JavaJive yaklang की तुलना में कुछ जानबूझकर समझौते करता है। पूर्ण mapping और migration guide के लिए देखें MIGRATE.md।
| Area | yaklang (upstream) | JavaJive |
|---|---|---|
| Decompiler ANTLR safety net | ANTLR Java grammar के माध्यम से dumped source को पुनः सत्यापित करता है; विफलता पर members को stubs में degrade करता है | हटाया गया (भारी dependency); validation एक no-op है, output सीधे emit होता है |
Support layer (utils / codec / log / go-funk) | साझा monorepo packages | internal/ के अंतर्गत न्यूनतम स्व-निहित पुनः कार्यान्वयन |
yso gadget generator | शामिल | शामिल नहीं |
String literal charset recovery (MatchMIMEType) | वैकल्पिक GBK/GB18030 recovery | stubbed (no-op); अधिकांश मामलों में व्यवहार अपरिवर्तित |
Third-party dependencies pure-Go libraries के एक छोटे सेट तक सीमित हैं
(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 cross-tests परीक्षण के समय वास्तविक Java artifacts compile करते हैं और उन्हें
JavaJive के विरुद्ध सत्यापित करते हैं; कोई JDK उपस्थित न होने पर वे स्वतः t.Skip कर देते हैं। harness और CI कैसे काम करते हैं, यह देखने के लिए
HARNESS-WORKFLOW.md देखें।
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