
مفكك ومشغل تسلسل Java مكتوب بالكامل بلغة Go
.war.zip.class (المجمّع الثابت،
الحقول، الدوال، الإصدار، أعلام الوصول).مصمّمة للمحمولية والتضمين:
javajive تغلّف القدرات الثلاث
جميعها؛ وتبقى الحزم الفرعية متاحة للاستخدام المتقدم.decompile و classinfo و serial،
مبنية على المكتبة القياسية..class / .jar حقيقية
وكتل مُسلسلة بـ JDK باستخدام javac/java، ثم تتحقق من JavaJive مقابلها
(انظر HARNESS-WORKFLOW.md).utils / codec / log / go-funk
كنواة internal/ دنيا ومكتفية ذاتياً.سجّل تدقيق تفاضلي كامل لـ 38 ملف JAR صفر تراجعات مسجّلة مقابل الأساس الثابت: أُبقيت جميع ملفات JAR العشرين النظيفة الترجمة سابقاً و26 منها تُترجم الآن بالكامل. تبقى عيوب الأساس و4 دوال موجودة كأطراف فارغة مرئية. انظر نتائج كل ملف JAR وإعادة الإنتاج.
تسجّل 250 رحلة ذهاب وإياب دلالية معزولة الترجمة والتحقق من JVM والأطراف الفارغة والتساوي في وقت التشغيل بشكل منفصل؛ فئات التطبيق الأصلية غائبة عن مسارات الفئات المعاد بناؤها. تشغّل 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 أخطاء نحوية عبر جميع ملفات JAR الـ34 (تأكيد صارم
تفرضه 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) | تحليل تدفق مُرمّز سادس عشرياً |
MarshalSerialized(objs...) []byte | إعادة ترميز الكائنات إلى صيغة النقل |
MarshalSerializedHex(objs...) string | إعادة الترميز إلى سادس عشري |
SerializedToJSON(objs...) ([]byte, error) | تحويل الكائنات إلى JSON |
SerializedFromJSON(raw) ([]JavaSerializable, error) | إعادة بناء الكائنات من JSON |
الحزم الفرعية مُصدّرة أيضاً للاستخدام المتقدم:
classparser، classparser/jarwar، serialization.
للحفاظ على المحمولية والصغر، تُجري JavaJive بعض المقايضات المتعمدة مقابل yaklang. انظر MIGRATE.md للخريطة الكاملة ودليل الترحيل.
| المجال | yaklang (الأصلية) | JavaJive |
|---|---|---|
| شبكة أمان ANTLR لفك الترجمة | تعيد التحقق من الشيفرة المُفرّغة عبر قواعد Java في ANTLR؛ تُحوّل الأعضاء إلى أطراف فارغة عند الفشل | مُزالة (تبعية ثقيلة)؛ التحقق عملية لا فعلية، والمخرجات تُصدر مباشرة |
طبقة الدعم (utils / codec / log / go-funk) | حزم مشتركة في المستودع الأحادي | إعادة تنفيذ دنيا مكتفية ذاتياً تحت internal/ |
مولّد أدوات yso | مُضمّن | غير مُضمّن |
استعادة ترميز محارف السلاسل النصية (MatchMIMEType) | استعادة اختيارية GBK/GB18030 | مُستبدل بطرف فارغ (لا فعلية)؛ السلوك دون تغيير في الغالبية العظمى من الحالات |
تقتصر تبعيات الطرف الثالث على مجموعة صغيرة من مكتبات 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