直接用vnu.jar启动HTTP服务是最轻量可控的HTML校验方式,需注意绑定地址、请求格式、健康检查及响应格式:默认bind-address为127.0.0.1,跨机调用须设0.0.0.0且-D参数置于-cp前;curl提交须带Content-Type: text/html; charset=utf-8及完整HTML文档;Docker健康检查宜用curl -f;CI需加?out=json获取JSON结果。

直接用 vnu.jar 启动 HTTP 服务是最轻量、最可控的 HTML 校验方式,不需要 Node.js 或 Python 环境,也不依赖外部 API,适合嵌入 CI 流程或作为内部质量网关。
用 java -cp vnu.jar 启动校验服务时端口被占或绑定失败
常见错误是启动后访问 http://localhost:8888 返回连接拒绝,或日志报 java.net.BindException: Address already in use。
-
BIND_ADDRESS默认为127.0.0.1,只允许本地访问;若需从其他机器调用(比如 CI 节点或前端测试机),必须显式设为0.0.0.0 - Java 启动参数中
-Dnu.validator.servlet.bind-address=0.0.0.0必须写在-cp之前,否则 JVM 不识别 - 端口冲突时别只 kill 进程,先确认是否已有容器在跑:
docker ps -q --filter "expose=8888" | xargs docker kill
curl -X POST 提交 HTML 校验时返回 400 或空响应
不是所有请求格式都支持。Nu Html Checker 的 HTTP 接口对 Content-Type 和 body 结构非常敏感:
- 必须带
Content-Type: text/html; charset=utf-8,不能是application/x-www-form-urlencoded或缺 charset - body 必须是完整 HTML 文档(含
<!DOCTYPE html>和<html>),不能只传片段或模板字符串 - 推荐用
curl -X POST -H "Content-Type: text/html; charset=utf-8" --data-binary "@index.html" http://localhost:8888,--data-binary防止换行符被 shell 吞掉
Docker 部署时健康检查总失败
Docker Compose 的 healthcheck 默认用 wget --spider,但 vnu 容器启动后首页返回的是 HTML 表单页面,不是 HTTP 200 纯文本响应,容易误判为失败。
立即学习“前端免费学习笔记(深入)”;
- 改用
curl -f http://localhost:8888/替代wget,-f只在 HTTP 状态码 ≥400 时失败 - 或直接检查服务是否监听:用
netstat -tlnp | grep :8888或ss -tlnp | grep :8888 - 别把
timeout设太短——首次加载规则集可能耗时 3~5 秒,timeout: 10s是底线
真正麻烦的不是启动服务,而是校验结果怎么解析。HTTP 接口默认返回 HTML 报告,CI 场景下需要 JSON 或 UNIX Exit Code;必须加 ?out=json 查询参数,且请求头仍要保持 Content-Type: text/html,这个组合容易被忽略。



















