- 新增浏览器模块技术文档,涵盖 BrowserCore、BrowserWindow 等核心组件 - 添加事件系统文档,包括 EventBus、GlobalEventBus 及各类事件定义 - 创建 LanguageManager 国际化管理器详细说明文档 - 新增 Log4j2OutputStream 标准输出重定向类文档 - 添加 Main 入口类启动流程与路由机制说明 - 创建 BrowserCreationCallback 回调接口使用指南 - 完善 AxisInnovatorsBox 主类架构与崩溃诊断系统文档
75 lines
4.1 KiB
Markdown
75 lines
4.1 KiB
Markdown
这是一个专门为 `com.axis.innovators.box.Main` 类编写的技术介绍文档。
|
||
|
||
---
|
||
|
||
# Main 类技术文档
|
||
|
||
**包路径:** `com.axis.innovators.box.Main`
|
||
**主要功能:** 应用程序入口点、启动路由、单实例控制
|
||
**作者:** tzdwindows 7
|
||
|
||
## 1. 概述
|
||
|
||
`Main` 类是 **Axis Innovators Box** 的核心启动器(Launcher)。它并不直接负责业务逻辑,而是扮演“调度员”的角色。它的主要职责包括初始化基础环境(语言、日志)、解析命令行参数、执行单实例检查,并根据输入文件的类型决定是启动完整的主程序,还是进入特定的“快速启动(Quick Start)”模式。
|
||
|
||
## 2. 核心流程与职责
|
||
|
||
### 2.1 启动预处理
|
||
在程序真正运行前,`Main` 执行以下环境准备工作:
|
||
* **日志清理:** 调用 `FolderCleaner` 清理过期的日志文件(保留最近10天)。
|
||
* **多语言初始化:** 通过 `LanguageManager` 加载用户保存的语言设置,默认为中文(zh_CN)。
|
||
* **插件目录重定向:** 解析 `pluginsDirectory=` 参数,动态设置插件加载路径。
|
||
|
||
### 2.2 启动路由机制 (Quick Start)
|
||
这是 `Main` 类最显著的特性。它会分析命令行传入的文件扩展名,并进行智能跳转:
|
||
|
||
| 文件类型 | 触发行为 | 对应组件 |
|
||
| :--- | :--- | :--- |
|
||
| `.jar` | 进入 JAR 可视化分析模式 | `ModernJarViewer` |
|
||
| `.html` | 进入 HTML 浏览模式 | `MainApplication` |
|
||
| 音乐类 (`.mflac`, `.mgg`, `.qmc`等) | 进入音乐解密界面 | `DecryptionUI` |
|
||
|
||
**快速启动逻辑:** 如果识别到上述特定文件,程序会立即启动对应的专用窗口,释放文件锁,并将 `quickStart` 标记设为 `true`,从而跳过完整的主界面初始化过程。
|
||
|
||
### 2.3 单实例锁 (Single Instance Lock)
|
||
为了防止多个程序实例同时运行冲突,`Main` 实现了一套基于文件锁的保护机制:
|
||
* **锁文件:** 在系统临时目录下创建 `axis_innovators_box.lock`。
|
||
* **原理:** 利用 `FileChannel.tryLock()` 尝试获取排他锁。如果获取失败,说明已有实例在运行,程序将直接退出。
|
||
* **释放:** 在程序关闭(Shutdown Hook)或进入快速启动模式时,会自动释放锁。
|
||
|
||
## 3. 命令行参数说明
|
||
|
||
`Main` 类支持以下关键参数:
|
||
|
||
* **`-debugControlWindow-on`**: 开启调试控制窗口(仅在非发布环境下有效)。
|
||
* **`pluginsDirectory="path"`**: 指定插件的存储目录。
|
||
* **文件路径**: 直接传入文件路径,程序会自动判断扩展名并路由至对应的工具。
|
||
|
||
## 4. 关键方法解析
|
||
|
||
### 4.1 `main(String[] args)`
|
||
启动主函数。逻辑顺序为:
|
||
1. 基础环境清理与加载。
|
||
2. 过滤并解析特定标志位参数。
|
||
3. 遍历文件参数,检查是否符合“快速启动”条件。
|
||
4. 如果不是快速启动模式,则尝试获取单实例锁。
|
||
5. 调用 `AxisInnovatorsBox.run()` 移交控制权。
|
||
|
||
### 4.2 `acquireLock()` & `releaseLock()`
|
||
* **`acquireLock`**: 尝试在磁盘上锁定文件。如果返回 `false`,则程序退出。
|
||
* **`releaseLock`**: 关闭文件通道并删除锁文件。这是确保应用能二次启动的关键清理步骤。
|
||
|
||
## 5. 设计模式与技术点
|
||
|
||
* **资源保护 (Shutdown Hook):** 通过 `Runtime.getRuntime().addShutdownHook` 注册清理线程,确保无论程序是正常关闭还是异常中止,都能尝试释放文件锁。
|
||
* **异步启动:** 对于 UI 组件(如 `ModernJarViewer` 和 `DecryptionUI`),使用 `SwingUtilities.invokeLater` 确保在事件调度线程(EDT)中创建界面,保证线程安全。
|
||
* **参数剥离:** 采用 `List<String> remainingArgs` 机制,将系统级参数(如目录设置)与业务级参数(待处理文件)分离。
|
||
|
||
## 6. 与 AxisInnovatorsBox 的关系
|
||
|
||
`Main` 类是第一级入口,而 `AxisInnovatorsBox` 是第二级核心。
|
||
* 如果 `Main` 识别到特定文件,它会配置一个轻量级的 `AxisInnovatorsBox` 实例(`quickStart=true`)。
|
||
* 如果没有特定文件,它将锁定单实例环境,并启动完整的 `AxisInnovatorsBox` 重量级主循环。
|
||
|
||
---
|
||
*文档生成时间: 2026-01-02* |