在架构导入和绑定中指定反斜杠时,XJC失败

时间:2019-04-24 08:45:18

标签: uri xjc xjb

我想使用xjc(版本2.3.0-b170531.0717)从XSD生成Java类

不幸的是,XSD导入了在具有Windows路径分隔符(反斜杠\)的相对路径中给定的另一个XSD,根据xsi:schemaLocation backslash not allowed?中的RFC-2396,它被表示为排除字符

仅运行xjc时,架构可以正常编译。但是我想使用命令行参数-b bindings.xjb指定一些绑定,然后反斜杠成为导致架构解析失败的问题。

如何解决此问题?我曾尝试使用目录来解析路径,但是在使用目录之前它似乎失败了。

最小的工作示例

a.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:b="b.xsd"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        elementFormDefault="qualified">
    <xsd:import namespace="b.xsd" schemaLocation=".\b.xsd"/>
</xsd:schema>

b.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    targetNamespace="b.xsd"
    elementFormDefault="qualified"/>

c.xjb

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    xmlns:xs="http://www.w3.org/2000/10/XMLSchema-instance"
    xs:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"
    jaxb:version="2.0" />

控制台输出

> xjc a.xsd
parsing a schema...
compiling a schema...

> xjc a.xsd -b c.xjb
parsing a schema...
[ERROR] Unable to parse ".\b.xsd" : File name is not an URI. Illegal character in path at index 1: .\b.xsd
  line 3 of a.xsd

Failed to parse a schema.

编辑:使用xjc -verbose,我得到了以下StackTrace,指出这是由于Java的URI类是标准遵从性,因此拒绝了反斜杠而引起的。

java.net.URISyntaxException: Illegal character in path at index 1: .\b.xsd
    at java.base/java.net.URI$Parser.fail(URI.java:2912)
    at java.base/java.net.URI$Parser.checkChars(URI.java:3083)
    at java.base/java.net.URI$Parser.parseHierarchical(URI.java:3165)
    at java.base/java.net.URI$Parser.parse(URI.java:3124)
    at java.base/java.net.URI.<init>(URI.java:598)
    at jdk.xml.bind@9.0.4/com.sun.tools.internal.xjc.reader.internalizer.AbstractReferenceFinderImpl.startElement(AbstractReferenceFinderImpl.java:81)
    at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509)
    at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:183)
    at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:351)
    at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2706)
    at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:601)
    at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112)
    at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:531)
    at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:887)
    at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:823)
    at java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
    at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
    at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:639)
    at jdk.xml.bind@9.0.4/com.sun.tools.internal.xjc.reader.internalizer.DOMForest.parse(DOMForest.java:380)
    at jdk.xml.bind@9.0.4/com.sun.tools.internal.xjc.reader.internalizer.DOMForest.parse(DOMForest.java:260)
    at jdk.xml.bind@9.0.4/com.sun.tools.internal.xjc.ModelLoader.buildDOMForest(ModelLoader.java:291)
    at jdk.xml.bind@9.0.4/com.sun.tools.internal.xjc.ModelLoader.loadXMLSchema(ModelLoader.java:344)
    at jdk.xml.bind@9.0.4/com.sun.tools.internal.xjc.ModelLoader.load(ModelLoader.java:147)
    at jdk.xml.bind@9.0.4/com.sun.tools.internal.xjc.ModelLoader.load(ModelLoader.java:102)
    at jdk.xml.bind@9.0.4/com.sun.tools.internal.xjc.Driver.run(Driver.java:339)
    at jdk.xml.bind@9.0.4/com.sun.tools.internal.xjc.Driver.run(Driver.java:206)
    at jdk.xml.bind@9.0.4/com.sun.tools.internal.xjc.Driver._main(Driver.java:129)
    at jdk.xml.bind@9.0.4/com.sun.tools.internal.xjc.Driver.access$000(Driver.java:67)
    at jdk.xml.bind@9.0.4/com.sun.tools.internal.xjc.Driver$1.run(Driver.java:88)

0 个答案:

没有答案