Jan 242009
 

Um die Java-Klassen für WebService-Clients zu generieren empfiehlt sich das JAX-WS-Plugin für Maven. Dieses klinkt sich bei Verwendung von “wsimport” in die Build-Phase “generate-sources” ein.

Für mich ist es sinnvoll, die WSDL-Dateien des anzusprechenden Services direkt in “src/wsdl” meines Projekts abzulegen statt diese über eine URL einzubinden. Dies hat den Vorteil, dass ich Änderungen an der Schnittstelle des Service in der Subversion-Historie nachvollziehen kann. Muss mein Projekt mehrere Service ansprechen, so lege ich die WSDL- plus die Schema-Datei (XSD) jedes Service im genannten Verzeichnis ab.

Ich verwende pro Service im Client-Projekt eine JAXB-Binding-Datei um ein Mapping von Datentypen der Service-Schnittstelle auf bestehende Java-Klassen zu definieren. Diese Binding-XML-Dateien liegen per Default des JAXWS-Plugins im Verzeichnis “src/jaxws”. So sieht zum Bsp eine solche Mapping-Datei bei mir aus:

<?xml version="1.0"?>
<jxb:bindings version="1.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
  xmlns:xs="http://www.w3.org/2001/XMLSchema">
 
  <jxb:bindings schemaLocation="../wsdl/Service1_schema1.xsd" node="/xs:schema">
    <jxb:bindings node="//xs:complexType[@name='type1']">
      <jxb:class ref="com.corp.package.Type1" />
    </jxb:bindings>
    <jxb:bindings node="//xs:complexType[@name='type2']">
      <jxb:class ref="com.corp.package.Type2" />
    </jxb:bindings>
    <jxb:bindings node="//xs:simpleType[@name='typeEnum']">
      <jxb:typesafeEnumClass ref="com.corp.package.TypeEnum" />
    </jxb:bindings>
  </jxb:bindings>
 
</jxb:bindings>

Ist in der pom.xml das JAX-WS-Plugin ohne zusätzliche Einstellungen (also Defaults) für “wsimport” eingebunden, so gibt es den folgenden Fehler:

[ERROR] "file:/[...]_schema1.xsd" is not a part of this compilation.
Is this a mistake for "file:/[...]Service_schema1.xsd"?
  line 5 of file:/[...]bindings_[...].xml

Um diesen Fehler zu vermeiden, muss Maven das JAX-WS-Plugin für jede WSDL-Datei getrennt in Verbindung mit der richtigen JAXB-Binding-Datei aufrufen.

Dies kann in der pom.xml durch Konfiguration nach folgendem Schema erreicht werden:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>jaxws-maven-plugin</artifactId>
  <version>1.11</version>
  <executions>
    <execution>
      <id>wsimport Service1</id>
      <goals>
        <goal>wsimport</goal>
      </goals>
      <configuration>
        <staleFile>${project.build.directory}/jaxws/stale/wsdl.Service1.done</staleFile>
        <packageName>com.corp.package1</packageName>
        <wsdlFiles>
          <wsdlFile>Service1.wsdl</wsdlFile>
        </wsdlFiles>
        <bindingFiles>
          <bindingFile>bindings_service1.xml</bindingFile>
        </bindingFiles>
      </configuration>
    </execution>
    <execution>
      <id>wsimport Service2</id>
      <goals>
        <goal>wsimport</goal>
      </goals>
      <configuration>
        <staleFile>${project.build.directory}/jaxws/stale/wsdl.Service2.done</staleFile>
        <packageName>com.corp.package2</packageName>
        <wsdlFiles>
          <wsdlFile>Service2.wsdl</wsdlFile>
        </wsdlFiles>
        <bindingFiles>
          <bindingFile>bindings_service2.xml</bindingFile>
        </bindingFiles>
      </configuration>
    </execution>
  </executions>
</plugin>

Die Java-Klassen für den WebService-Client liegen dann unter “target/jaxws/import”. Ich hoffe mit diesen Zeilen kann ich wieder ein paar armen Seelen helfen, Aspirin zu sparen.

  One Response to “Generierung WebService-Client für mehrere WSDLs mit Maven”

  1. Guten Morgen Herr Neumann

    Mit dem Fehler “is not a part of this compilation” habe ich letzten Freitag Abend mehere Stunden verbracht. Heute Morgen habe ich ihre Webseite gefunden, die hat mir den Start in die neue Arbeitswoche extrem versüsst. Der Tipp pro WSDL eine eigene execution zu definieren war Golt wert.

    Vielen Dank!

    Freundliche Grüsse aus der Schweiz
    Daniel König

 Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>