我通常使用ASM静态代码审计,因为它只能处理Class字节码。而有些应用系统使用的还是jsp作为脚本页面,所以我想把jsp都编译为class然后静态代码审计。我使用tomcat-jasper作为jsp编译引擎来编译字节码遇到一些问题:
- jsp编译时候有类加载和资源加载问题,需要给JspC对象设定classpath和web.xml参数。
- 应用系统jsp中自身可能有语法错误,需要手动修复然后再编译很麻烦。
然后我就想能不能把tomcat-jasper的编译操作封装下,然后再结合Skills技术给ai添加技能点,让ai读取JspC的编译日志然后自动修复jsp文件中的语法错误然后继续编译找问题修复。
JspCompile 是一个基于 Apache Tomcat Jasper (JspC) 引擎的轻量级 JSP 编译工具。它专为 Web 项目(尤其是 Legacy 系统)的安全审计和语法检查而设计。
通过全量或增量编译 Web 目录下的 JSP 文件,本工具能快速暴露页面中的 Import 错误、Tag 属性格式问题、类缺失等语法隐患,并生成详细的审计日志。
配合 Skills 使用,它还能实现从“编译 -> 报错 -> 自动修复 -> 再编译”的自动化闭环。
- 全量编译: 递归扫描指定 Web 根目录(
uriroot)下的所有 JSP 文件。 - 指定编译: 支持仅编译用户指定的一个或多个 JSP 文件(逗号分隔)。
- 智能配置: 自动识别并加载目标目录下的
WEB-INF/web.xml,确保编译上下文正确。 - 噪声过滤: 智能识别 Fragment 文件(如
.inc,include目录、_common.jsp),过滤因缺少上下文导致的误报错误。 - 统计报告: 生成带时间戳的日志文件,文件名包含成功编译的文件数量(如
success_8649.log),直观反映项目健康度。 - 无损修复: 配合 AI Skill,仅针对语法错误进行微创修复,严禁修改业务逻辑或增删无关代码。
使用 Maven 进行构建:
mvn clean package构建成功后,在 target 目录下会生成可执行的 JAR 包:JspCompiler.jar。
基本语法:
java -jar JspCompiler.jar <web_root_path> [jsp_file_path1,jsp_file_path2,...]<web_root_path>: Web 项目的根目录(必须包含WEB-INF目录)。[jsp_file_path...]: (可选) 需要编译的特定 JSP 文件相对路径,多个文件用逗号分隔。
示例:
-
全量编译整个项目:
java -jar JspCompiler.jar "F:\projects\my-webapp" -
仅编译特定文件:
java -jar JspCompiler.jar "F:\projects\my-webapp" "/index.jsp,/login.jsp"
工具会在 <web_root_path>_jspCompile 目录下生成日志文件:
- 文件名格式:
jspc_compile_YYYYMMDD_HHmmss_success_N.log - 内容: 包含详细的错误堆栈信息、编译耗时、成功数量统计。
本项目包含一个 Skills 配置 (/skills/jsp-compile),专为 AI 辅助jsp编译设计。
Skill 能力:
- 自动编译: 根据用户指令自动调用
JspCompiler.jar。 - 智能分析: 解析日志中的
SEVERE错误。 - 自动修复: 针对 Import 缺失、属性错误等常见问题,自动修改JSP源码。
- 原则: 严禁修改业务逻辑,仅修复语法错误。
- 循环验证: 修复后自动重新编译,确保问题解决。
Skill 脚本位置:
- 定义文件:
skills/jsp-compile/SKILL.md - 执行脚本:
skills/jsp-compile/scripts/JspCompiler.jar
使用方式:
- 将skills目录放在AI IDE的skills技能配置目录下,我这里使用的是windsurf,其他的AI IDE看官方文档可以找到
- 在AI IDE中与AI进行对话,不同的AI对于JspCompile技能的执行效果不同。对比执行我发现Gemini和GLM实践效果更好
请你使用jsp-compile技能帮我编译目录 /opt/ecology 下的jsp文件,用中文和我交流
- 最后生成的结果在XXX_jspCompile目录下,xxx.log是JspC编译日志,jspc_compile_ai_fix.md是ai修复的日志


