Jouduin taas pitkästä aikaa tekemään asioita Tomcatilla ja servleteillä eli konfiguroimaan Javaa. Voi hyvänen aika että se on edelleen hankalaa ja monimutkaista. Sadoittain erilaisia propertyjä, classpatheja, jarreja ja xml-tiedostoja, tolkuttoman pitkiä error traceja.

Java-ihmisillä ei ilmeisesti koskaan käy edes mielessä, että arkkitehtuureja voisi yrittää yksinkertaistaa. Tämä on toisaalta loogista, koska he ovat lähinnä konsultteja, jotka saavat palkkion monimutkaisuuden luomisesta ja ymmärtämisestä.

Omassa tapauksessani piti tehdä simppeli servletti, joka kutsuu toisaalla olevaa SOAP-rajapintaa ja tulostaa sen palauttaman arvon. Käytännössä tämä edellytti ainakin seuraavia asioita (serverinä Ubuntu 9.04):

  • Tomcatin, Axis-kirjaston ja mod_jk:n asentaminen.
  • Mod_jk:n konfiguroiminen Apachen direktiiveillä.
  • Erillisen (turhan) workers.properties-tiedoston konfiguroiminen.
  • Tomcast-sovelluksen context-asetusten konfiguroiminen.
  • Tomcast-sovelluksen web.xml-asetusten konfiguroiminen (pitää määritellä servlet-name, servlet-description, url-mapping jne.)
  • Oikean classpathin ja komentorivin arpominen WSDL2Java-työkalulle (aina yksi puuttuva jarri lisäten ja kilometrin error tracea tulkiten).
  • SOAP-stubin generoiminen WSDL2Javalla.
  • Pohtiminen, mitä WSDL2Javan generoimasta neljästä luokasta (PortType, Service, ServiceLocator, SOAPStub) pitää oikeasti kutsua.
  • Servletin koodaaminen Javalla (tämä oli kaikkein yksinkertaisin osuus).
  • Ihmettely, miksi SOAP-stubin käyttäminen aiheuttaa Class Not Found -virheilmoituksen Tomcatissa (joka tietenkin vielä vaihtelee ja antaa hieman erilaisia ilmoituksia välillä).
  • Tomcatin permissioiden konfiguroiminen policy.d:hen siten, että servlet saa AllPermissionit, tarvittavat FilePermissionit ja RuntimePermissionin getClassLoaderiin. Ilman ei Axis toimi.

Voi tietysti väittää, että kaiken tämän osaaminen on rautaista ammattitaitoa. Minä taas väitän, että se on pelkkää puupäisyyttä. Käyttämällä SOAPin sijasta REST-rajapintaa tämän kaiken voisi tehdä vaikkapa Pythonilla tai PHP:llä yhdellä ohjelmarivillä, joka tekee yhden HTTP-kutsun.

Ratkaisun tulisi aina olla yhtä yksinkertainen kuin ongelmakin on.

Published 9.6.2009