Feladat: Csináljunk egy WS Clientet Eclipse-ben Maven 2-vel. (Megjegyzés: Gyűlölöm a Maven-t. Ez a post az “ismerd meg ellenséged” jegyében született.)

I. Maven plugin Eclipse-hez: Én az m2eclipse plugint installáltam (http://m2eclipse.sonatype.org/)

II. Új Project: Hozzunk létre új Maven Projectet eclipse-ben:

Fontos, hogy bejelöljük a Simple Project opciót (nem akarunk Maven Project templateket használni):
A következő lépésben be kell állítanunk a groupId-t és az artifactId-t. A groupId egy egyedi azonosítója a company-nak vagy projectnek. Kb olyan mint a Java-ban a package. Az artifactId a konkrét Eclipse-es Project (modul) neve (kb a jar file neve). Egy Project aktuális buildjét a következőkkel tudjuk egyértelműen azonosítani:[groupId:artifactId:version]
Mindezek után a következő Projectet láthatjuk az Eclipseben:

Itt látható, hogy a Maven-es projecteknek más a hierarchiája mint a standard Eclipse-es projecteknek. Pl.: nincs bin mappa a Projecten belül. Ha lehetőség van rá használjuk a maven-es hierarchiát, így megspóroljuk a pom file szerkesztgetését. Indulásnak a következő könyvtárszerkezetünk van:
  • src/main/java: Csak a forráskódnak amit írunk.
  • src/main/resources: Minden más resource (Nálunk pl.: a WSDL file és a konfig fileok is).
  • src/test/java: JUnit tesztek
  • src/resources: a tesztekhez szükséges resource-ok, amik nem lesznek deployolva…
  • target: a fordítás eredménye kerül ide. (+ a resource fileok is)

III: Project Object Model: A pom.xml file irja le a teljes projectet. Szemben az ant-tal, ahol a build.xml file leírja a definiált projectünk elemein végzendő műveleteket (dependent lib-eket tesz a classpathra, fordít, könyvtárat hoz létre, jar/war file-t készít, deployol, stb.), a maven pom.xml-je a project gerincét adja. Itt határozzuk meg a project függőségeit, a pluginokat amelyeket a build sorén használni szeretnénk, a repository-kat amelyekből a különböző lib-eket letölti a Maven.

A Maven Project életciklusai:

  • generate sources: pl.: A mi esetünkben a wsdl fileból generál Java forráskódot.
  • compile: A forráskód fordítása.
  • test-compile: A JUnit tesztek fordítása.
  • test: A JUnit tesztek futtatása.
  • package: jar, war stb.
  • integration-test:deployol az staging environmentre ha szükséges.
  • install:belepakolja a local repository-ba az elkészült jar/war filet, ha más projectek ezen dependálnak.
  • deploy: production environmentre másolja fel a végleges verziót.

A mi pom xml fileunk a következőképpen néz ki:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>GAAuthWSTest</groupId>
    <artifactId>GAAuthWSTest</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</project>
Hogy teszteljük a Maven Pluginunkat az Eclipse-ben, futtassunk egy Maven installt:
Az Maven install végeredményének egy “BUILD SUCCESSFUL” üzenetnek kell lennie. (Ha nem ez, akkor valami van az installált pluginnal.)
IV. WSDL File: Másoljuk be a WSDL file-unkat az src/main/resources dir-be.
V. Client stub generálása a WSDL file-ból: Legalább 3 különböző módszerrel lehetne Java kódot generálni a wsdl file-ból Maven-nal. Egyrészt szóba kerülhet a maven “antrun” plugin-ja, ahol használhatnánk a jól ismert “axis-wsdl2java” task-ot. Másrészt ha axis2-t szeretnénk használni, akkor a maven saját “wsdl2code” plugin-ja is megfelelő lehet. A probléma az axis-szal, hogy rengeteg és eléggé átláthatatlan kódot generál. Az ultimate solution wiszont a “jaxws” maven plugin használata. Gyönyörű, tiszta és egyszerű kódot generál, része a Java 1.6-nak, stb. Ami probléma lehet, hogy a wsimport (jaxws code generáló parancsa) nem támogatja az RPC/Encoded tipusokat.
VI. JAX-WS Plugin: A hivatalos leírás a következő webhelyen található: https://jax-ws-commons.dev.java.net/jaxws-maven-plugin/
Ahhoz hogy büzemeljük a “jaxws” plugint, a következő elemeket kell hozzáadnunk a pom.xml filehoz:
Először is adjuk hozzá a sun jaxws-rt lib-jét a dependenciák közé. A többi függőséggel nem kell foglalkoznunk, a maven autómatikusan kideríti, hogy ennek mire van szüksége, és letölti azokat is.
<dependencies>
    <dependency>
        <groupId>com.sun.xml.ws</groupId>
        <artifactId>jaxws-rt</artifactId>
        <version>2.1.3</version>
    </dependency>
</dependencies>
Pluginok:
<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
  <source>1.6</source>
  <target>1.6</target>
  </configuration>
</plugin>
A fenti plugin azért szükséges, hogy a Maven a 6-os java-val fordítsa a Projectet. (Egyébként valami 1.3-assal lenne kompatibilis talán… :( )

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <executions>
        <execution>
            <id>add-source</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>add-source</goal>
            </goals>
            <configuration>
                <sources>
                    <source>src/main/java</source>
                    <source>src/main/generated</source>
                    <source>src/main/resources</source>
                    <source>src/test/java</source>
                </sources>
            </configuration>
        </execution>
    </executions>
</plugin>
A build helper pluginra akkor lehet szükségünk, ha eltérünk a standard maven directory struktúrától (mint például mi a generated sources esetében).

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxws-maven-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>wsimport</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <wsdlUrls>
            <wsdlUrl>src/main/resources/AuthWService.wsdl</wsdlUrl>
        </wsdlUrls>
        <sourceDestDir>src/main/generated</sourceDestDir>
        <packageName>com.wk.auth.ws</packageName>
    </configuration>
</plugin>
És végül a “jaxws-maven-plugin” melynek a wsdlimport goal-ja generálja nekünk a Java forrást a wsdl fileból. A configuration sectionban megadhatjuk a wsdl file helyét, a package nevét és a directory-t ahová a forráskódot generálja a goal.

VII. Hibák, amikbe belefutottam:

  1. Java verzió:A Java 1.6 update 4 előtti változatai a JAX-WS 2.0-át használják. Én a mavennel viszont a 2.1.3-as verziót töltöttem le. Probléma nem is látszott egészen addíg, amíg az Eclipse-ből nem akartam futtatni közvetlenül egy tesztet. Mivel ekkor az eclipse-ben beállított sun-os rt.jar-t kezdte használni a program, a maven által letöltött jaxws-rt.jar helyett. Java update-vel megoldódott.
  2. RPC/Encoded wsdl file: Nincs rá megoldás. A JAX-WS nem támogatja…
Follow

Get every new post delivered to your Inbox.