[Bug] Windows 下 dataDir 路径缺少分隔符导致数据库创建位置错误
环境信息
- Huntly 版本: v0.6.4(JAR 文件:
huntly-server-0.6.4.jar)
- 操作系统: Windows 10/11
- Java 版本: OpenJDK 21
问题描述
在 Windows 系统下使用 --huntly.dataDir 参数指定数据目录时,如果路径末尾没有分隔符,数据库文件会被创建到错误的位置。
复现示例
# 启动命令
java -jar huntly-server-0.6.4.jar --huntly.dataDir="C:\Users\name\huntly"
# 期望的数据库路径
C:\Users\name\huntly\db.sqlite
# 实际的数据库路径(BUG)
C:\Users\name\huntlydb.sqlite
# ^ 缺少分隔符!
根因分析
通过解压 JAR 文件,确认问题在 application.yml 中:
spring:
datasource:
url: jdbc:sqlite:${huntly.dataDir:}db.sqlite?date_class=TEXT
配置使用了简单的字符串拼接,没有确保 dataDir 和 db.sqlite 之间有路径分隔符。
临时解决方案(用户侧)
使用正斜杠并加上尾部斜杠:
java -jar huntly-server-0.6.4.jar --huntly.dataDir="C:/Users/name/huntly/"
正斜杠在 Windows Java 中同样有效,且避免了反斜杠的转义问题。
建议修复方案
方案 A:修改 application.yml(改动最小)
在占位符默认值中添加尾部斜杠:
spring:
datasource:
url: jdbc:sqlite:${huntly.dataDir:./}db.sqlite?date_class=TEXT
但这只能解决空值情况,无法处理用户传入的无尾部斜杠路径。
方案 B:在 HuntlyProperties 中规范化路径(推荐)
在 HuntlyProperties.java 或启动配置中添加路径规范化:
@PostConstruct
public void normalizeDataDir() {
if (dataDir != null && !dataDir.isEmpty()) {
// 确保尾部有分隔符
if (!dataDir.endsWith(File.separator) && !dataDir.endsWith("/")) {
dataDir += File.separator;
}
}
}
方案 C:使用 File 或 Path API(最佳实践)
避免在 YAML 中拼接路径,改为在代码中构造:
File dbFile = new File(dataDir, "db.sqlite");
String dbUrl = "jdbc:sqlite:" + dbFile.getAbsolutePath() + "?date_class=TEXT";
或使用 NIO:
Path dbPath = Paths.get(dataDir, "db.sqlite");
String dbUrl = "jdbc:sqlite:" + dbPath.toAbsolutePath() + "?date_class=TEXT";
这样可以正确处理所有平台的路径分隔符。
补充信息
- 该问题在 Windows 中文用户名路径(如
C:\Users\中文名\...)下更容易触发,因为路径处理本身就比较敏感
- JAR 文件名显示
0.6.4,但启动日志显示 v0.5.0,版本号显示可能也需要检查一下
感谢开发这个优秀的项目!
以上是ai自己分析写的。我平常使用openclaw的minimax-m2.7来手动启动huntly,偶然间换成其他模型发现简单的一句话命令不能启动原有的数据库了(这个是模型指令遵循度的问题,用高遵循度模型就能套用skill的经验),然后ai说是跨平台的基础问题bug。
[Bug] Windows 下
dataDir路径缺少分隔符导致数据库创建位置错误环境信息
huntly-server-0.6.4.jar)问题描述
在 Windows 系统下使用
--huntly.dataDir参数指定数据目录时,如果路径末尾没有分隔符,数据库文件会被创建到错误的位置。复现示例
根因分析
通过解压 JAR 文件,确认问题在
application.yml中:配置使用了简单的字符串拼接,没有确保
dataDir和db.sqlite之间有路径分隔符。临时解决方案(用户侧)
使用正斜杠并加上尾部斜杠:
java -jar huntly-server-0.6.4.jar --huntly.dataDir="C:/Users/name/huntly/"正斜杠在 Windows Java 中同样有效,且避免了反斜杠的转义问题。
建议修复方案
方案 A:修改
application.yml(改动最小)在占位符默认值中添加尾部斜杠:
但这只能解决空值情况,无法处理用户传入的无尾部斜杠路径。
方案 B:在
HuntlyProperties中规范化路径(推荐)在
HuntlyProperties.java或启动配置中添加路径规范化:方案 C:使用
File或PathAPI(最佳实践)避免在 YAML 中拼接路径,改为在代码中构造:
或使用 NIO:
这样可以正确处理所有平台的路径分隔符。
补充信息
C:\Users\中文名\...)下更容易触发,因为路径处理本身就比较敏感0.6.4,但启动日志显示v0.5.0,版本号显示可能也需要检查一下感谢开发这个优秀的项目!
以上是ai自己分析写的。我平常使用openclaw的minimax-m2.7来手动启动huntly,偶然间换成其他模型发现简单的一句话命令不能启动原有的数据库了(这个是模型指令遵循度的问题,用高遵循度模型就能套用skill的经验),然后ai说是跨平台的基础问题bug。