Generierung WebService-Client für mehrere WSDLs mit Maven

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.

Ein Kommentar zu “Generierung WebService-Client für mehrere WSDLs mit Maven”

  1. Martin

    Na das sind doch mal gute Nachrichten, dass jemand soetwas postet. Sehr interessant! Danke vielmals!

Einen Kommentar schreiben: