jaxb-如何将xsd文件映射到URL以查找它们

jaxb-如何将xsd文件映射到URL以查找它们,jaxb,xjc,Jaxb,Xjc,我有一个xsd,它有典型的导入语句来导入其他xsd文件,但不幸的是,引用是硬编码的路径。JAXB中是否有方法使用xbj文件覆盖这些导入的位置 所有这些XSD都是通过另一个jar(在jar内部)交付的,因此我希望将其中一个从类路径中移除,当它导入时,其他人尝试对其进行配置,以便将其他人从类路径中移除 谢谢, Dean您可以尝试以编程方式与XJC交互(见下文),并插入自己的EntityResolver来解析XML模式: import com.sun.codemodel.*; import com.s

我有一个xsd,它有典型的导入语句来导入其他xsd文件,但不幸的是,引用是硬编码的路径。JAXB中是否有方法使用xbj文件覆盖这些导入的位置

所有这些XSD都是通过另一个jar(在jar内部)交付的,因此我希望将其中一个从类路径中移除,当它导入时,其他人尝试对其进行配置,以便将其他人从类路径中移除

谢谢,
Dean

您可以尝试以编程方式与XJC交互(见下文),并插入自己的EntityResolver来解析XML模式:

import com.sun.codemodel.*;
import com.sun.tools.xjc.*;
import com.sun.tools.xjc.api.*;

SchemaCompiler sc = XJC.createSchemaCompiler();
sc.setEntityResolver(new YourEntityResolver());
sc.setErrorListener(new YourErrorListener());
sc.parseSchema(SYSTEM_ID, element);
S2JJAXBModel model = sc.bind();
下面是我给出的一个相关答案的链接,一些人认为这个答案很有用:


有许多方法可用于解决此问题:

目录

可以使用目录文件替代架构位置。这里有几个例子:

根据命名空间使用另一个架构:

PUBLIC "http://example.org/A" "others/schema_a.xsd"
根据架构位置使用其他架构:

REWRITE_SYSTEM "https://example.org/a.xsd" "others/schema_a.xsd"
允许您使用架构文件的本地副本

请参阅和指南。 不幸的是,XJC中的目录支持并不总是像预期的那样工作,而且调试起来有点困难

从Maven工件解析模式

如果您使用的是Maven,那么可以使用Maven-jaxb2-plugin,它可以解析Maven工件中的模式:

REWRITE_SYSTEM "https://example.org/a.xsd" "maven:org.example:a!/a.xsd"
结合目录,您可以让JAXB在
a-XXX.jar
中使用
a.xsd
而不是
https://example.org/a.xsd

请参见以下示例项目:


编程使用?即使标准的XJC支持目录,也没有必要产生如此深远的影响。@lexicore——我的第一个想法是XML目录()。建议使用programattic方法的原因是,真正的模式存在于类路径上的JAR中,并且这些位置可能无法通过XML目录进行配置。提取JAR也是一个选项。:)