.xsd 不是此汇编的一部分。这是 .xjb 的错误吗

.xsd is not a part of this compilation. Is this a mistake for .xjb

我正在尝试更改 xjb 文件中的 schemaLocation 以使用 URL 不使用远程文件,而是使用也在版本控制下的本地副本。

例如我的 xjb 文件有类似于

的内容
<?xml version="1.0" encoding="UTF-8"?>
<jxb:bindings
        xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xsd:ID="JaxbBindingsForWMiddleware"
        version="2.0">

    <jxb:bindings node="/xsd:schema"
                  schemaLocation="http://myserver:80/a/b/c/d/myxsd.xsd">

例如,当我将其更改为本地副本时

schemaLocation="../../src/main/resources/myxsd.xsd">

mvn clean install 将失败并显示类似于

的消息

[WARNING] Caused by: com.sun.istack.SAXParseException2; systemId: file:/E:/somefolder/somefolder/myjavaproject/target/bindings/myxjb.xjb; lineNumber: 33; columnNumber: 33; "file:/E:/somefolder/somefolder/myjavaproject/target/bindings/mywsdl.wsdl" is not a part of this compilation. Is this a mistake for "file:/E:/somefolder/somefolder/myjavaproject/target/bindings/myxjb.xjb"?

我注意到它正在 target 目录中寻找我的 wsdl 文件。我可以以指向 src 目录的方式操作 schemaLocation。然后路径存在,但消息仍然存在。

我也可以将 wsdl 放在目标目录中,java 试图找到它,但在那种情况下,消息也保持不变。

因此看起来需要发生一些特定的事情才能使其成为此汇编的一部分。应该怎么做才能以正确的方式编译它?

我已经成功了

  1. 将架构和绑定都放入 src/main/resources

    src/main/resources/myxsd.xsd

    src/main/resources/mybindings.xjb

  2. 将您的 Maven 插件指向 运行 xjc 以在那里找到文件

  3. 在绑定文件中使用

    schemaLocation="myxsd.xsd"

如果您想在 src/main/resources 下添加一些目录,您当然可以这样做 - 您必须在指定 schemaLocation 时找出要使用的正确相对路径。

在我的环境(版本 2.2)中,它仅在文件位于专用文件夹(src/main/xsd/schema.xsd 和绑定 ind src/main/xsb/binding.xsb 中的架构和绑定时才有效文件相对引用模式:schemaLocation="../xsd/schema.xsd"

接缝真的很脆弱。

在查看问题时,我可以建议以下步骤:

首先,假设您正在使用一些插件来生成您的存根。我使用 cxf-codegen-plugin(你可以使用任何一个),重要的一步是定义你的绑定文件的位置,假设它在 resources\wsdl
里面是片段:

<plugin>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-codegen-plugin</artifactId>
    <version>${cxf.version}</version>
    <configuration>
        <encoding>UTF-8</encoding>
    </configuration>
    <executions>
        <execution>
            <id>generate-sources</id>
            <phase>generate-sources</phase>
            <configuration>
                <wsdlOptions>
                    <wsdlOption>
                        <wsdl>${basedir}/src/main/resources/wsdl/YOUR_WSDL_NAME.wsdl</wsdl>
                        <wsdlLocation>classpath:wsdl/YOUR_WSDL_NAME.wsdl</wsdlLocation>
                        <extraargs>
                            <extraarg>-xjc-Xts</extraarg>
                        </extraargs>
                        <bindingFiles>
                            <bindingFile>${basedir}/src/main/resources/wsdl/binding.xml</bindingFile>
                        </bindingFiles>
                    </wsdlOption>
                </wsdlOptions>
            </configuration>
            <goals>
                <goal>wsdl2java</goal>
            </goals>
        </execution>
    </executions>

    <dependencies>
        <dependency>
            <groupId>org.apache.cxf.xjcplugins</groupId>
            <artifactId>cxf-xjc-ts</artifactId>
            <version>${cxf.version}</version>
        </dependency>
    </dependencies>
</plugin>

接下来,所以现在在执行 "mvn generate-sources" 时,maven 知道在哪里寻找您的绑定文件。假设您还将 xsd 文件放在 resources\wsdl 文件夹中(您可以使用任何路径)
让我们看看 binding.xml

的片段
<jxb:bindings schemaLocation="YOUR_XSD_FILE.xsd" node="/xs:schema">
        .....
</jxb:bindings>


由于您已经在 maven 插件中定义了您的绑定文件路径,并且您的 xsd 也在该路径中,因此您无需在绑定文件的 schemaLocation 中再次定义此路径。

在插件配置的 pom 文件中添加 xsd 后它开始工作,如下所示:

                <bindingDirectory>
                    src/main/resources/binding
                </bindingDirectory>

                <bindingFiles>
                    <bindingFile>bindings.xjb</bindingFile>
                    <bindingFile>../xsd/egrul.xsd</bindingFile>
                    <bindingFile>../xsd/arrays.xsd</bindingFile>
                </bindingFiles>

我在编译期间收到此错误,因为我的 IDE 在包含 JAXB 编译的包下添加了一个 bin/ 目录。它已通过使用 rm -rf BaseDirectory/bin/rm -rf BaseDirectory; git co BaseDirectory 修复。后者大概better/more完成。

(我很少使用的 Eclipse 将输出编译成 bin/,而 IntelliJ IDEA 或原始 gradle 编译成 build/

在我的例子中,我只需要更新 maven-jaxb2-plugin 版本:

<groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb2-plugin</artifactId>
                <version>0.14.0</version>