Jsoup类名变更致Grails Markdown兼容失效,需官方更新及临时方案
Grails Markdown仅有的v3.0.0版本发布于2015年,内部依赖Jsoup。Jsoup v1.15.1为使用更具包容性的语言,将Whitelist类重命名为Safelist,原兼容用的shim在该版本被标记废弃并移除。如果为修复Jsoup的CVE漏洞升级到v1.15.3,会因为Grails Markdown仍引用Whitelist类导致代码报错,而Grails团队暂未发布新版本,以下是几个可行的临时解决方案:
自定义类桥接
在项目中创建一个org.jsoup.safety.Whitelist类,手动实现对Safelist的桥接,让Grails Markdown的调用能无缝转发到新类:package org.jsoup.safety; public class Whitelist { private final Safelist safelist; private Whitelist(Safelist safelist) { this.safelist = safelist; } public static Whitelist basic() { return new Whitelist(Safelist.basic()); } public static Whitelist relaxed() { return new Whitelist(Safelist.relaxed()); } // 按需实现Grails Markdown用到的其他方法,比如addTags、addAttributes等 public Whitelist addTags(String... tags) { safelist.addTags(tags); return this; } // 暴露内部Safelist给Jsoup的其他API使用 public Safelist toSafelist() { return safelist; } }确保这个类能被类加载器优先加载,覆盖Jsoup原本已移除的
Whitelist类。修改Grails Markdown字节码
用ASM、Javassist这类字节码编辑工具,把Grails Markdown jar包中所有引用org.jsoup.safety.Whitelist的地方替换成org.jsoup.safety.Safelist,同时调整对应的方法调用(比如Whitelist.basic()改成Safelist.basic())。修改后的jar包作为本地依赖引入项目,替换官方的Grails Markdown v3.0.0。依赖排除+自定义打包
- 先在项目依赖里排除Grails Markdown自带的旧版Jsoup(以Gradle为例,Maven同理):
implementation('org.grails.plugins:markdown:3.0.0') { exclude group: 'org.jsoup', module: 'jsoup' } implementation 'org.jsoup:jsoup:1.15.3' - 下载Grails Markdown v3.0.0的源码,把所有
Whitelist相关代码替换成Safelist,重新编译打包成自定义jar包,引入项目使用。
- 先在项目依赖里排除Grails Markdown自带的旧版Jsoup(以Gradle为例,Maven同理):
临时降级Jsoup(不推荐)
如果你的项目中CVE漏洞的影响范围可控,可以临时降级到Jsoup v1.15.0及以下版本——这些版本还保留了Whitelist的兼容shim,不会触发报错。但这只是权宜之计,漏洞风险依然存在,要尽快跟进官方修复。
内容的提问来源于stack exchange,提问作者Soven K Rout

