我正在使用maven-jaxb2-plugin。這裏是我的插件配置獲取錯誤在使用maven-jaxb2-plugin時,只允許一個globalBindings自定義在整個編譯中
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<executions>
<execution>
<id>xjc-serviceoperations</id>
<phase>generate-sources</phase>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<generateDirectory>${basedir}/src/main/java/</generateDirectory>
<schemaDirectory>src/main/resources/schemas/lmsapi/serviceoperations</schemaDirectory>
<removeOldOutput>false</removeOldOutput>
</configuration>
</execution>
<execution>
<id>xjc-types</id>
<phase>generate-sources</phase>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<generateDirectory>${basedir}/src/main/java</generateDirectory>
<schemaDirectory>src/main/resources/schemas/lmsapi/types</schemaDirectory>
<bindingDirectory>src/main/resources/schemas</bindingDirectory>
<bindingIncludes>
<include>schema-binding.xjb</include>
</bindingIncludes>
<removeOldOutput>false</removeOldOutput>
</configuration>
</execution>
</executions>
</plugin>
這裏是我的架構,binding.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:annox="http://annox.dev.java.net"
xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb
http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"
version="2.1">
<jaxb:globalBindings>
<jaxb:javaType name="java.time.LocalDateTime" xmlType="xsd:dateTime"
parseMethod="com.softech.ls360.lms.api.proxy.xsd.binder.XSDateTimeCustomBinder.parseDateTime"
printMethod="com.softech.ls360.lms.api.proxy.xsd.binder.XSDateTimeCustomBinder.printDateTime" />
<jaxb:javaType name="java.time.LocalDate" xmlType="xsd:date"
parseMethod="com.softech.ls360.lms.api.proxy.xsd.binder.XSDateCustomBinder.parseDateTime"
printMethod="com.softech.ls360.lms.api.proxy.xsd.binder.XSDateCustomBinder.printDateTime" />
<xjc:serializable uid="1" />
</jaxb:globalBindings>
</jaxb:bindings>
我有一個xsd Enrollments.xsd
。我有日期類型。我希望任何具有日期或日期時間類型的xsd都轉換爲Localdate或Localdatetime而不是XMLGregorianCalendar。這裏是片段
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://enrollment.types.lmsapi.message.webservice.lms.vu360.softech.com"
xmlns="http://enrollment.types.lmsapi.message.webservice.lms.vu360.softech.com"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xsd:include schemaLocation="Learner.xsd"/>
...
<xsd:complexType name="LearnerEnrollCourses">
<xsd:sequence>
<xsd:element name="CourseId" type="xsd:string" minOccurs="1" maxOccurs="unbounded" nillable="false" />
</xsd:sequence>
<xsd:attribute name="enrollmentStartDate" type="xsd:date" use="required" />
<xsd:attribute name="enrollmentEndDate" type="xsd:date" use="required" />
</xsd:complexType>
...
</xsd:schema>
現在,當我右擊POM。選擇Run As -> Maven generate-sources
然後我得到以下錯誤
[INFO] Sources are not up-to-date, XJC will be executed.
[ERROR] Error while parsing schema(s).Location [ file:/D:/Basit/eclipse-jee-mars-2/workspace/360Training/Java%208/LS360ProxyAPI/LmsApiProxy/src/main/resources/schemas/schema-binding.xjb{12,26}].
com.sun.istack.SAXParseException2; systemId: file:/D:/Basit/eclipse-jee-mars-2/workspace/360Training/Java%208/LS360ProxyAPI/LmsApiProxy/src/main/resources/schemas/schema-binding.xjb; lineNumber: 12; columnNumber: 26; only one globalBindings customization is allowed in a whole compilation
at com.sun.tools.xjc.ErrorReceiver.error(ErrorReceiver.java:86)
at com.sun.tools.xjc.reader.xmlschema.ErrorReporter.error(ErrorReporter.java:84)
....
[ERROR] Error while parsing schema(s).Location [ file:/D:/Basit/eclipse-jee-mars-2/workspace/360Training/Java%208/LS360ProxyAPI/LmsApiProxy/src/main/resources/schemas/schema-binding.xjb{12,26}].
com.sun.istack.SAXParseException2; systemId: file:/D:/Basit/eclipse-jee-mars-2/workspace/360Training/Java%208/LS360ProxyAPI/LmsApiProxy/src/main/resources/schemas/schema-binding.xjb; lineNumber: 12; columnNumber: 26; (related to above) but one is already given at this location
雖然類正在生成。但是type仍然是XMLGregorianCalendar。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "LearnerEnrollCourses", propOrder = {
"courseId"
})
public class LearnerEnrollCourses {
@XmlElement(name = "CourseId", required = true)
protected List<String> courseId;
@XmlAttribute(name = "enrollmentStartDate", required = true)
@XmlSchemaType(name = "date")
protected XMLGregorianCalendar enrollmentStartDate;
@XmlAttribute(name = "enrollmentEndDate", required = true)
@XmlSchemaType(name = "date")
protected XMLGregorianCalendar enrollmentEndDate;
我在做什麼錯在配置和我怎麼能解決呢?
感謝
---------------------編輯------------------ -----
這個插件配置正在工作。
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<executions>
<execution>
<id>xjc-serviceoperations</id>
<phase>generate-resources</phase>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<generateDirectory>${basedir}/src/main/java/</generateDirectory>
<schemaIncludes>
<schemaInclude>schemas/lmsapi/serviceoperations/*.xsd</schemaInclude>
</schemaIncludes>
<bindingIncludes>
<bindingInclude>schemas/schema-binding.xjb</bindingInclude>
</bindingIncludes>
<verbose>true</verbose>
<extension>true</extension>
<removeOldOutput>false</removeOldOutput>
</configuration>
</execution>
<execution>
<id>xjc-types</id>
<phase>generate-resources</phase>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<generateDirectory>${basedir}/src/main/java</generateDirectory>
<schemaDirectory>schemas/lmsapi/types</schemaDirectory>
<schemaIncludes>
<schemaInclude>**/*.xsd</schemaInclude>
</schemaIncludes>
<schemaExcludes>
<schemaExclude>Enrollment.xsd</schemaExclude>
</schemaExcludes>
<removeOldOutput>false</removeOldOutput>
<verbose>true</verbose>
<extension>true</extension>
</configuration>
</execution>
</executions>
</plugin>
這裏是我的架構,binding.xjb
<jaxb:globalBindings>
<jaxb:javaType name="java.time.LocalDateTime" xmlType="xsd:dateTime"
parseMethod="com.softech.ls360.lms.api.proxy.schema.binder.XSDateTimeCustomBinder.parseDateTime"
printMethod="com.softech.ls360.lms.api.proxy.schema.binder.XSDateTimeCustomBinder.printDateTime" />
<jaxb:javaType name="java.time.LocalDate" xmlType="xsd:date"
parseMethod="com.softech.ls360.lms.api.proxy.schema.binder.XSDateCustomBinder.parseDateTime"
printMethod="com.softech.ls360.lms.api.proxy.schema.binder.XSDateCustomBinder.printDateTime" />
<!-- Force all classes implements Serializable -->
<xjc:serializable uid="1" />
</jaxb:globalBindings>
<jaxb:bindings schemaLocation="lmsapi/types/Enrollment.xsd" node="/xsd:schema" >
<jaxb:schemaBindings >
<jaxb:package name="com.softech.vu360.lms.webservice.message.lmsapi.types.enrollment" />
</jaxb:schemaBindings>
</jaxb:bindings>
這是我從serviceoperations和類型目錄中的文件之一
EnrollmentServiceOperations.xsd:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://enrollment.serviceoperations.lmsapi.message.webservice.lms.vu360.softech.com"
xmlns="http://enrollment.serviceoperations.lmsapi.message.webservice.lms.vu360.softech.com"
xmlns:enrolmnt="http://enrollment.types.lmsapi.message.webservice.lms.vu360.softech.com"
xmlns:tr="http://transactionresult.types.lmsapi.message.webservice.lms.vu360.softech.com"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xsd:import namespace="http://transactionresult.types.lmsapi.message.webservice.lms.vu360.softech.com" schemaLocation="../types/TransactionResultType.xsd"/>
<xsd:import namespace="http://enrollment.types.lmsapi.message.webservice.lms.vu360.softech.com" schemaLocation="../types/Enrollment.xsd"/>
<xsd:element name="LearnerCoursesEnrollRequest">
<xsd:complexType>
....
</xsd:complexType>
</xsd:element>
....
</xsd:schema>
CustomerServiceOperations.xsd:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://customer.serviceoperations.lmsapi.message.webservice.lms.vu360.softech.com"
xmlns="http://customer.serviceoperations.lmsapi.message.webservice.lms.vu360.softech.com"
xmlns:cust="http://customer.types.lmsapi.message.webservice.lms.vu360.softech.com"
xmlns:tr="http://transactionresult.types.lmsapi.message.webservice.lms.vu360.softech.com"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xsd:import namespace="http://transactionresult.types.lmsapi.message.webservice.lms.vu360.softech.com" schemaLocation="../types/TransactionResultType.xsd"/>
<xsd:import namespace="http://customer.types.lmsapi.message.webservice.lms.vu360.softech.com" schemaLocation="../types/Customer.xsd"/>
<xsd:element name="AddCustomerRequest">
<xsd:complexType>
...
</xsd:complexType>
</xsd:element>
...
</xsd:schema>
類型/ Enrollment.xsd
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://enrollment.types.lmsapi.message.webservice.lms.vu360.softech.com"
xmlns="http://enrollment.types.lmsapi.message.webservice.lms.vu360.softech.com"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xsd:include schemaLocation="Learner.xsd"/>
<xsd:complexType name="LearnerCourses">
....
</xsd:complexType>
....
</xsd:schema>
類型/ Customer.xsd
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://customer.types.lmsapi.message.webservice.lms.vu360.softech.com"
xmlns="http://customer.types.lmsapi.message.webservice.lms.vu360.softech.com"
xmlns:addr="http://address.types.lmsapi.message.webservice.lms.vu360.softech.com"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xsd:import namespace="http://address.types.lmsapi.message.webservice.lms.vu360.softech.com" schemaLocation="Address.xsd"/>
<xsd:complexType name="Customers">
<xsd:sequence>
....
</xsd:sequence>
</xsd:complexType>
...
</xsd:schema>
現在我運行Run As -> Maven generate-sources
。它將在src/main/java/com/..../serviceoperation/customer/AddCustomerRequest.java
中生成服務操作源,並在src/main/java/com/.../types/customer/Customers.java
中鍵入源。類似於其他xsds。爲什麼我不應該使用<generateDirectory>${basedir}/src/main/java/</generateDirectory>
。這就是我要的。我認爲這個插件是從每個xsd中的目標名稱空間製作包。我對嗎 ?
如果我在配置這個插件時做錯了,請告訴我,以便我可以更正它。就像你說的不要在src/main/java中生成一樣。
我希望我的所有xsds在服務操作文件夾(src/main/resources/schemas/lmsapi/serviceoperation/*.xsd)
應生成src/main/java/com/..../serviceoperation/customer/*.java
,src/main/java/com/..../serviceoperation/enrollment/*.java
文件夾和其他人相同。
(src/main/resources/schemas/lmsapi/types/*.xsd)
中的所有xsds應產生src/main/java/com/..../types/customer/*.java
,src/main/java/com/..../types/enrollment/*.java
文件夾和其他人相同。
而且我的綁定文件也適用於所有xsds (src/main/resources/schemas/schema-binding.xjb)
伺服操作和類型文件夾中的所有xsds。
有沒有更好的方法來配置這個插件,然後請告訴我,所以我可以糾正它在我身邊。我猜你是這個插件的作者。
感謝&問候
巴西特馬哈茂德·艾哈邁德·
請發表'mvn clean install -X'日誌。你也應該*不*產生到'src/main/java'和[使用單獨的目標目錄進行單獨執行](https://github.com/highsource/maven-jaxb2-plugin/wiki/Use-Separate-Target-目錄換獨立-處決)。 – lexicore
請檢查我的編輯。謝謝 – Basit
仍然沒有看到'mvn clean install -X'日誌。至於生成'src/main/java'中的代碼,當然你可以做任何你想做的事情,但Maven約定是生成的代碼進入'target/generated-source/'。 –
lexicore