Eclipse RCP中JDK 17的accessExternalSchema问题求助
解决方案
1. 验证VM参数是否生效
先在插件代码中输出系统属性,确认javax.xml.accessExternalSchema是否真的被设置为all:
System.out.println(System.getProperty("javax.xml.accessExternalSchema"));
如果输出不是all,说明启动参数没生效——检查Eclipse启动配置的VM参数是否正确添加,或者RCP产品配置中的VM参数是否覆盖了启动器设置。
2. 代码中显式配置XML解析器属性
全局VM参数可能因类加载器或解析器实例的优先级问题不生效,直接在创建SchemaFactory时设置属性:
import javax.xml.XMLConstants; import javax.xml.validation.SchemaFactory; // 创建SchemaFactory时指定权限 SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); schemaFactory.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "all"); // 后续用该实例加载XSD
这种方式直接针对解析器实例生效,不受全局配置的影响。
3. 调整XSD引用与加载方式
如果XSD之间是相对路径引用(比如message.xsd引用service.xsd),尝试通过类加载器直接读取资源流,绕开bundleresource协议的限制:
import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; // 从Jar包中读取XSD资源 StreamSource messageSource = new StreamSource(getClass().getResourceAsStream("/xsd/message.xsd")); StreamSource serviceSource = new StreamSource(getClass().getResourceAsStream("/xsd/service.xsd")); // 同时加载多个依赖的XSD Schema schema = schemaFactory.newSchema(new StreamSource[]{messageSource, serviceSource});
4. 添加插件权限声明
在插件的plugin.xml中添加权限,确保插件可以访问bundleresource协议的资源:
<plugin> <!-- 其他配置 --> <extension point="org.eclipse.core.runtime.permissions"> <permission class="java.io.FilePermission" name="bundleresource:///-" actions="read"/> </extension> </plugin>
内容的提问来源于stack exchange,提问作者Marco Maisano
相关产品推荐
相关产品推荐

