Gradle 8中使用Saxon Jar解决SecurityException问题求助
Saxon依赖冲突导致SecurityException问题解决
异常信息
java.lang.SecurityException: class "net.sf.saxon.value.UntypedAtomicValue"'s signer information does not match signer information of other classes in the same package
该类net.sf.saxon.value.UntypedAtomicValue属于Saxon-HE。通过分析项目传递依赖发现:
- checkstyle依赖
net.sf.saxon:Saxon-HE:12.2 - PMD相关依赖
net.sourceforge.saxon:saxon:9.1.0.8
移除checkstyle后异常消失,确认是二者的Saxon依赖冲突导致。
1. 错误原因
- 同一个Java包
net.sf.saxon.value下的类来自两个不同版本、不同签名的JAR包:新版Saxon-HE 12.2(由checkstyle引入)和旧版saxon 9.1.0.8(由PMD引入)。 - JVM加载类时会校验同包类的签名一致性,确保它们来自同一可信来源。当同包类签名不匹配时,JVM会抛出
SecurityException,防止不可信或被篡改的类混入运行环境。
2. Gradle 8(Groovy DSL)修复方案
方案一:排除冲突依赖并统一版本
在PMD的依赖配置中排除旧版saxon,同时保留checkstyle引入的新版Saxon-HE:
dependencies { // 其他依赖保持不变... implementation('net.sourceforge.pmd:pmd:6.54.0') { exclude group: 'net.sourceforge.saxon', module: 'saxon' } implementation('net.sourceforge.pmd:pmd-java:6.54.0') { exclude group: 'net.sourceforge.saxon', module: 'saxon' } implementation('net.sourceforge.pmd:pmd-core:6.54.0') { exclude group: 'net.sourceforge.saxon', module: 'saxon' } }
也可以通过全局依赖策略强制统一版本:
configurations.all { resolutionStrategy { force 'net.sf.saxon:Saxon-HE:12.2' exclude group: 'net.sourceforge.saxon', module: 'saxon' } }
方案二:调整依赖范围(仅适用于非运行时场景)
如果checkstyle和PMD仅用于代码检查,不需要在程序运行时调用其API,可以将依赖范围改为compileOnly,避免运行时加载冲突JAR:
dependencies { // 其他依赖保持不变... compileOnly 'com.puppycrawl.tools:checkstyle:10.12.1' compileOnly 'net.sourceforge.pmd:pmd:6.54.0' compileOnly 'net.sourceforge.pmd:pmd-java:6.54.0' compileOnly 'net.sourceforge.pmd:pmd-core:6.54.0' }
方案三:升级PMD版本
PMD新版本(如7.x)已改用net.sf.saxon:Saxon-HE替代旧版依赖,升级PMD到兼容版本可消除冲突:
dependencies { // 其他依赖保持不变... implementation 'net.sourceforge.pmd:pmd:7.0.0' implementation 'net.sourceforge.pmd:pmd-java:7.0.0' }
升级前需确认新版本与项目代码的兼容性。
内容的提问来源于stack exchange,提问作者Ellen Spertus
相关产品推荐
相关产品推荐

