.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 试图找到它,但在那种情况下,消息也保持不变。
因此看起来需要发生一些特定的事情才能使其成为此汇编的一部分。应该怎么做才能以正确的方式编译它?
我已经成功了
将架构和绑定都放入 src/main/resources
src/main/resources/myxsd.xsd
src/main/resources/mybindings.xjb
将您的 Maven 插件指向 运行 xjc 以在那里找到文件
在绑定文件中使用
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>
我正在尝试更改 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 试图找到它,但在那种情况下,消息也保持不变。
因此看起来需要发生一些特定的事情才能使其成为此汇编的一部分。应该怎么做才能以正确的方式编译它?
我已经成功了
将架构和绑定都放入 src/main/resources
src/main/resources/myxsd.xsd
src/main/resources/mybindings.xjb
将您的 Maven 插件指向 运行 xjc 以在那里找到文件
在绑定文件中使用
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>