logo
0
1
WeChat Login
feat: mvp 版本实现

Mimir4j Diff - Jar反编译对比工具

一个基于Web的Jar包反编译和差异对比工具(MVP版本)。

功能特性

  • Jar包上传: 支持上传两个Jar文件进行对比(最大100MB)
  • 自动反编译: 使用IntelliJ Fernflower反编译引擎
  • 智能对比: 自动识别新增、删除、修改的文件
  • 可视化展示:
    • 文件树结构展示
    • 并排代码对比视图
    • 语法高亮显示
    • 差异行高亮
  • 统计信息: 显示变更文件数量和分类统计

技术栈

后端

  • Spring Boot 3.2.0
  • IntelliJ Fernflower (反编译)
  • Java Diff Utils (差异对比)
  • Java 17

前端

  • HTML5 + JavaScript
  • Bootstrap 5.3
  • Diff2Html (差异可视化)

快速开始

环境要求

  • JDK 8 或更高版本
  • Maven 3.6+

快速启动

方式一:使用启动脚本(推荐)

Windows:

start.bat

Linux/Mac:

chmod +x start.sh ./start.sh

方式二:手动启动

  1. 克隆项目
git clone <repository-url> cd mimir4j-diff
  1. 编译项目
mvn clean package
  1. 运行应用
java -jar target/mimir4j-diff-1.0.0-SNAPSHOT.jar

或使用Maven插件运行:

mvn spring-boot:run
  1. 访问应用

打开浏览器访问: http://localhost:8080

使用说明

  1. 上传Jar包

    • 在首页上传两个Jar文件(标记为Jar A和Jar B)
    • 支持的文件格式:.jar
    • 单个文件大小限制:100MB
  2. 开始对比

    • 点击"开始对比"按钮
    • 等待反编译和对比过程完成(可能需要几十秒)
  3. 查看结果

    • 左侧文件树显示所有变更文件
    • 点击文件查看详细差异
    • 文件状态说明:
      • 🔴 仅在A:该文件仅存在于Jar A
      • 🟢 仅在B:该文件仅存在于Jar B
      • 🟡 已修改:两个Jar中都存在但内容不同

配置说明

主要配置项位于 src/main/resources/application.properties

# 服务端口 server.port=8080 # 文件上传限制 spring.servlet.multipart.max-file-size=100MB spring.servlet.multipart.max-request-size=200MB # 临时目录(在当前运行目录下创建) app.temp.dir=./temp # 反编译超时时间(毫秒) app.decompile.timeout=300000 # 最大class文件数量 app.max.class.files=5000

项目结构

mimir4j-diff/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/mimir/diff/ │ │ │ ├── MimirDiffApplication.java # 启动类 │ │ │ ├── config/ │ │ │ │ └── WebConfig.java # Web配置 │ │ │ ├── controller/ │ │ │ │ └── DiffController.java # REST API │ │ │ ├── service/ │ │ │ │ ├── DecompileService.java # 反编译服务 │ │ │ │ └── DiffService.java # 对比服务 │ │ │ └── model/ │ │ │ ├── DiffResult.java # 结果模型 │ │ │ ├── DiffSummary.java # 统计信息 │ │ │ ├── FileDiff.java # 文件差异 │ │ │ ├── FileStatus.java # 文件状态 │ │ │ └── FileTreeNode.java # 文件树节点 │ │ └── resources/ │ │ ├── application.properties # 应用配置 │ │ └── static/ │ │ ├── index.html # 上传页面 │ │ ├── diff.html # 对比页面 │ │ └── js/ │ │ ├── upload.js # 上传逻辑 │ │ └── diff.js # 对比展示逻辑 ├── spec/ │ └── feature.md # 需求文档 ├── pom.xml # Maven配置 └── README.md # 本文件

API接口

POST /api/diff

上传两个Jar文件进行对比

请求参数:

  • jarA (File): Jar包A
  • jarB (File): Jar包B

响应示例:

{ "jarAName": "app-v1.0.jar", "jarBName": "app-v2.0.jar", "summary": { "onlyInA": 3, "onlyInB": 8, "modified": 12 }, "fileTree": { ... }, "files": [ { "path": "com/example/User.java", "status": "modified", "contentA": "...", "contentB": "...", "diff": "..." } ] }

限制说明

  • 单个Jar文件大小:≤ 100MB
  • Class文件总数:≤ 5000个
  • 反编译超时时间:5分钟
  • 仅支持标准Java class文件

常见问题

Q: 反编译失败怎么办? A: 确保Jar包有效且包含标准Java class文件。某些混淆的代码可能无法完全反编译。

Q: 处理时间过长? A: 大型Jar包可能需要较长时间,请耐心等待。如果超过5分钟,请检查文件大小和复杂度。

Q: 浏览器兼容性? A: 推荐使用Chrome 90+、Firefox 88+或Safari 14+。

许可证

MIT License

贡献

欢迎提交Issue和Pull Request。