如何访问jar包内部的XSD文件并解决getResource读取返回null的问题
错误原因
Class.getResource("相对路径")默认从当前类的包目录下查找资源,你的XSD文件存放在classpath根目录,不带前缀/的写法无法命中对应文件,因此返回null,才会出现路径拼接null的报错。- JAR包是归档压缩文件,内部的资源不属于文件系统的独立实体文件,不能通过
java.io.File类读取,必须使用类加载器提供的资源访问方法。
正确实现方式
如果你的XSD文件放在项目resources根目录(打包后会出现在JAR包的根路径下),按需选择以下写法:
直接读取资源流
// 前缀/表示从classpath根路径查找资源 InputStream xsdStream = MigrationsApplication.class.getResourceAsStream("/DBRegister.xsd"); // 后续用流对象处理XSD内容即可
给SchemaFactory加载XSD使用
import javax.xml.XMLConstants; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Schema; import java.net.URL; // ... SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); URL xsdUrl = MigrationsApplication.class.getResource("/DBRegister.xsd"); // 提前判空避免空指针 if (xsdUrl == null) { throw new RuntimeException("未找到classpath下的DBRegister.xsd,请检查资源打包配置"); } Schema schema = factory.newSchema(xsdUrl);
校验注意事项
打包完成后可以手动解压JAR包,确认根目录下存在DBRegister.xsd文件,如缺失需检查构建工具(Maven/Gradle)的资源过滤配置,确保resources目录下的xsd文件被正常打包。
内容的提问来源于stack exchange,提问作者Fabio
相关产品推荐
相关产品推荐

