我试图在我的schemaLocation
文件中更改xjb
以使用不是使用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
会因类似的消息而失败
[警告]引起: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”不是此编译的一部分。这是“file:/ E:/somefolder/somefolder/myjavaproject/target/bindings/myxjb.xjb”的错误吗?
我注意到它正在target
目录中查找我的wsdl文件。我可以操纵schemaLocation
,使其指向src
目录。然后路径存在,但消息仍然存在。
我也可以将wsdl放在目标目录中,java尝试在其中找到它,但在这种情况下,消息保持不变。
所以看起来需要特定的东西来使它成为这个编译的一部分。应该怎么做才能以正确的方式编译它?
在我的环境(版本2.2)中,只有当文件位于专用文件夹(src / main / xsd / schema.xsd中的模式和绑定ind src / main / xsb / binding.xsb)并且绑定文件相对于模式引用时,它才起作用:schemaLocation =“../ xsd / schema.xsd”
它看起来真的很脆弱。
它在我在插件配置中的pom-file中添加我的xsd后开始工作,如下所示:
<bindingDirectory>
src/main/resources/binding
</bindingDirectory>
<bindingFiles>
<bindingFile>bindings.xjb</bindingFile>
<bindingFile>../xsd/egrul.xsd</bindingFile>
<bindingFile>../xsd/arrays.xsd</bindingFile>
</bindingFiles>
在查看问题时,我可以建议以下步骤:
首先,假设您使用一些插件来生成存根。我使用cxf-codegen-plugin(你可以使用任何),重要的一步是定义你的绑定文件的位置,让我们说它里面的资源\ 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中再次定义此路径。
我成功了
如果你想在src / main / resources下添加一些目录,你当然可以这样做 - 你必须找出在指定schemaLocation时使用的正确相对路径。
我在编译期间收到此错误,因为我的IDE已使用JAXB编译在包下添加了bin/
目录。它是通过使用rm -rf BaseDirectory/bin/
或rm -rf BaseDirectory; git co BaseDirectory
来修复的。后者可能更好/更完整。
(Eclipse,我很少使用,将输出编译成bin/
,而IntelliJ IDEA或raw gradle编译成build/
)