2016-04-21 28 views
1

Ich benutze maven-jaxb2-plugin. Hier ist meine Plugin-KonfigurationFehler bekommen nur eine GlobalBindings Anpassung ist in einer ganzen Kompilierung erlaubt während maven-jaxb2-plugin

<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> 

hier ist meine Schema-binding.xml Datei

<?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> 

Ich habe eine XSD Enrollments.xsd. In dem ich den Datumstyp habe. Ich möchte, dass alle xsd mit Datum oder Datetime-Typ zu Localdate oder Localdatetime anstelle von XMLGregorianCalendar konvertieren. hier ist das Snippet

<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> 

Nun, wenn ich nach rechts auf POM klicken. wählen Run As -> Maven generate-sources dann bin ich folgende Fehlermeldung bekommen

[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 

Obwohl Klassen generieren. Aber der Typ ist immer noch 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; 

Was ich tue, falsch in der Konfiguration und wie kann ich sie lösen?

Dank

--------------------- EDIT ------------------ -----

Diese Plugin-Konfiguration funktioniert.

<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> 

hier ist mein Schema-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> 

Hier ist meine eine der Dateien aus serviceoperations und Typen Verzeichnis

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> 

Typen/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> 

Typen/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> 

Jetzt, wenn ich Run As -> Maven generate-sources ausführen. Es wird ServiceOperationsquellen in src/main/java/com/..../serviceoperation/customer/AddCustomerRequest.java generieren und Quellen in src/main/java/com/.../types/customer/Customers.java eingeben. Ähnlich für andere xsds.

Warum sollte ich nicht <generateDirectory>${basedir}/src/main/java/</generateDirectory> verwenden.Das ist was ich will. Ich denke, dass dieses Plugin Packages von Targetnamespace in jedem xsd macht. Habe ich recht ?

Wenn ich bei der Konfiguration dieses Plugins etwas falsch mache, dann sag es mir bitte, damit ich es korrigieren kann. Wie Sie gesagt haben, nicht in src/main/java generieren.

Ich möchte, dass alle meine xsds in ServiceOperations Ordner (src/main/resources/schemas/lmsapi/serviceoperation/*.xsd) in src/main/java/com/..../serviceoperation/customer/*.java, src/main/java/com/..../serviceoperation/enrollment/*.java Ordner und das gleiche für andere generieren sollte.

Alle xsds in (src/main/resources/schemas/lmsapi/types/*.xsd) sollten in src/main/java/com/..../types/customer/*.java, src/main/java/com/..../types/enrollment/*.java Ordner und gleich für andere generieren.

Und auch meine verbindliche Datei gilt für alle xsds (src/main/resources/schemas/schema-binding.xjb) alle xsds in servieoperations und Typen-Ordner.

Gibt es eine bessere Möglichkeit, dieses Plugin zu konfigurieren, dann sagen Sie mir bitte, damit ich es auf meiner Seite korrigieren kann. Ich schätze, Sie sind der Autor dieses Plugins.

Dank & Grüße

Basit Mahmood Ahmed

+0

Bitte posten Sie 'mvn clean install -X' log. Sie sollten auch * nicht * auf 'src/main/java' generieren und [separate Zielverzeichnisse für separate Ausführungen verwenden] (https://github.com/highsource/maven-jaxb2-plugin/wiki/Use-Separate-Target- Verzeichnisse für separate Ausführungen). – lexicore

+0

Bitte überprüfen Sie meine Bearbeitung. Danke – Basit

+0

Noch sehe das 'mvn saubere Installation-X' Protokoll nicht. Wie beim Generieren des Codes in 'src/main/java', können Sie natürlich tun, was Sie wollen, aber Maven Konvention ist, dass generierter Code in' target/generated-source/ 'geht. – lexicore

Antwort

0

hatte ein ähnliches Problem und löste es durch die java version from 1.8 -> 1.7 zu verändern.

Alternativ entfernt xjc:serializable uid="1" funktioniert auch.

2

Aktueller Status dieses Problem, andere Frustration und die Suche ...

Dieses Problem zeigt sich zufällig zu ersparen und wird durch einen Fehler in JAXB Implementierung verursacht. Das Problem wurde gemeldet https://java.net/jira/browse/JAXB-687 aber es ist jetzt geschlossen, auch wenn es nicht behoben ist (siehe Kommentar von suboptimal Benutzer am 16. September 2016 veröffentlicht).