Uncle小说PC版源码编译与打包实战

1. 项目背景与核心功能

Uncle小说是一款开源的PC端小说阅读器,支持Windows和MacOS双平台。它的核心功能是通过智能解析技术实现全网小说的内容获取和阅读体验优化。作为一个长期使用该软件的老用户,我发现它在停止维护后仍然具有很高的实用价值,这也是我决定深入研究其源码并进行修复的初衷。

这款软件最吸引我的地方在于它的"书源模式"设计。不同于传统阅读器需要手动导入书源,Uncle小说能够自动识别和解析各大小说网站的目录结构。实测下来,对于起点、纵横等主流小说网站的支持非常稳定,解析成功率能达到90%以上。软件还内置了有声小说支持,这在同类工具中算是比较少见的特色功能。

2. 环境准备与源码获取

2.1 开发环境配置

在开始编译前,我们需要准备以下开发环境:

  • JDK 11:这是项目的最低要求,推荐使用OpenJDK。我在Windows 10上测试过AdoptOpenJDK 11.0.15和Amazon Corretto 11.0.18都能正常工作
  • Gradle 7.x:项目使用Gradle作为构建工具,建议安装7.5以上版本
  • Git:用于克隆源码仓库,版本建议2.30+

对于Windows用户,还需要额外安装:

  • exe4j:用于生成Windows可执行文件
  • Inno Setup:制作安装包的工具

环境变量配置是个容易踩坑的地方。记得将JDK的bin目录和Gradle的bin目录都添加到系统PATH中。我遇到过因为PATH设置不当导致gradlew.bat执行失败的情况,错误提示往往不太明显。

2.2 源码获取方式

官方源码仓库已经停止维护,但我们可以通过以下两种方式获取代码:

  1. 直接下载ZIP包
wget https://github.com/unclezs/uncle-novel/archive/refs/heads/main.zip

这种方式简单快捷,适合只想快速尝试编译的用户。

  1. Git克隆(推荐):
git clone https://github.com/unclezs/uncle-novel.git cd uncle-novel

使用Git克隆可以保留完整的提交历史,方便后续追踪代码变更。我在实际项目中创建了自己的fork仓库,这样可以在不影响原项目的情况下进行修改。

3. 关键问题分析与解决

3.1 自动更新机制破解

原软件通过jfx-launcher模块实现自动更新功能,这会导致两个问题:

  1. 启动时强制检查更新,由于服务器已关闭导致卡死
  2. 更新后会覆盖本地修改的版本

经过分析源码,我发现更新逻辑主要在Launcher.java的syncManifest方法中。我的解决方案是:

  1. 克隆jfx-launcher的源码仓库
  2. 修改syncManifest方法,直接返回false
  3. 重新编译生成jar包

关键修改代码如下:

public boolean syncManifest() { log.info("更新检查已禁用"); return false; }

3.2 启动弹窗屏蔽

软件启动时会显示一个强制退出的模态对话框。通过全局搜索错误信息,在AppStarter.java中找到相关代码:

// 注释掉以下两行 // ModalBox.none().message("bye~").title("bye~").cancel("bye~").showAndWait(); // App.stopApp();

这个修改需要重新编译主程序模块才能生效。注意修改后要清理之前的构建缓存,否则可能会遇到奇怪的运行时问题。

4. 完整编译与打包流程

4.1 分模块编译

项目采用多模块结构,需要按顺序编译:

  1. 编译jfx-launcher
cd jfx-launcher ./gradlew build

编译成功后,生成的jar包位于build/libs目录下。需要将这个文件复制到本地Gradle缓存目录(通常是~/.gradle/caches)。

  1. 编译主程序
cd ../app ./gradlew build

这个过程会下载所有依赖项,首次执行可能需要较长时间。我在测试时遇到过依赖下载失败的情况,可以通过添加阿里云镜像来解决:

repositories { maven { url 'https://maven.aliyun.com/repository/public' } mavenCentral() }

4.2 跨平台打包

项目支持生成多种平台的安装包:

  • Windows
./gradlew packageWin64

打包需要exe4j和Inno Setup的支持。生成的安装包位于app/build/packager目录。

  • MacOS
./gradlew packageMac

Mac打包需要Xcode命令行工具。注意M1芯片可能需要额外配置。

  • Linux
./gradlew packageLinux

Linux打包目前还存在一些问题,建议优先使用Windows或Mac版本。

5. 常见问题排查指南

5.1 依赖下载失败

错误表现:

Could not resolve all files for configuration ':app:runtimeClasspath'

解决方案:

  1. 检查网络连接,确保能访问Maven中央仓库
  2. 尝试添加国内镜像源
  3. 执行clean和--refresh-dependencies命令

5.2 Windows打包工具缺失

错误信息:

Error: Inno Setup compiler (iscc) not found in PATH

解决方法:

  1. 确认已安装Inno Setup 6
  2. 将安装目录(如C:\Program Files (x86)\Inno Setup 6)添加到系统PATH
  3. 重启命令行终端

5.3 版本兼容性问题

有时会遇到JDK版本不兼容的情况,错误提示可能包含"unsupported class file version"等信息。这时需要:

  1. 检查环境变量中的JAVA_HOME指向正确的JDK 11
  2. 在gradle.properties中明确指定版本:
org.gradle.java.home=C:\\path\\to\\jdk11

6. 功能扩展建议

完成基础修复后,可以考虑进一步的功能增强:

  1. 书源管理:添加书源导入导出功能
  2. 阅读体验优化:支持更多字体和排版选项
  3. 本地缓存:实现章节内容本地缓存,减少重复解析
  4. 插件系统:通过插件机制扩展功能

这些改进可以让软件更加实用。我在自己的版本中添加了深色模式切换快捷键,大大提升了夜间阅读体验。修改主要集中在ThemeManager.java文件中,通过监听系统主题变化自动切换界面风格。

整个修复过程让我深刻体会到阅读他人代码的重要性。虽然一开始面对一个陌生项目会有些无从下手,但通过逐步分析和调试,最终能够理解其设计思路并做出改进,这种成就感是无可替代的。建议有兴趣的开发者可以clone代码自己尝试修改,遇到问题欢迎交流讨论。