Treenaan tossa web-palvelujen toteuttamista Axis:n avulla.
Otin toimivat esimerkkisoftat, ne kääntyivät hyvin koneessani, itse serveripään softan asensin tomcat:iin luotuun wepapps:n alla olevaan axis hakemistoon .jws-luokkana.
Ajaessani ohjelmaa java-komennolla virtuaalikone
ilmoittaa seuraavan ongelman:
Exception in thread "main" java.lang.UnsupportedClassVersionError: HarjoitusClient
(Unsupported major.minor version 49.0)
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Ajettavassa ohjelmassa käytetään näitä luokkia:
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
Olen asettaunt WIN XP:n ohjauspaneelin kautta CLASSPATH:lle yllä käytettyjä luokkia vastaavan polkumäärityksen, joka on luokkapolun alussa.
. ;C:\axis-1_1\lib\axis.jar;C:\axis-1_1\lib\jaxrpc.jar;C:\axis-1_1\lib\saaj.jar;C:\axis-1_1\lib\commons-logging.jar;C:\axis-1_1\lib\commons-discovery.jar;C:\axis-1_1\lib\wsdl4j.jar;%CLASSPATH%;%CATALINA_HOME%\bin\startup;%JAVA_HOME%\bin;%JAVA_HOME%\lib;%JAVA_HOME%;%CATALINA_HOME%\common\lib\servlet.jar;C:\Sun\AppServer\jdk\lib\J2ee.jar;C:\Sun\AppServer\jdk\bin;C:\Sun\AppServer\jdk\lib;C:\Program Files\Java\jdk1.5.0_01\bin;C:\Program Files\Java\jdk1.5.0_01\lib;C:\SolidSDKe352\jdbc\SolidDriver2.0.jar;\c:;C:\PROGRA~1\IBM\SQLLIB\java\db2java.zip;C:\PROGRA~1\IBM\SQLLIB\java\db2jcc.jar;C:\PROGRA~1\IBM\SQLLIB\java\sqlj.zip;C:\PROGRA~1\IBM\SQLLIB\java\db2jcc_license_cu.jar;C:\PROGRA~1\IBM\SQLLIB\bin;C:\PROGRA~1\IBM\SQLLIB\tools\db2XTrigger.jar;C:\PROGRA~1\IBM\SQLLIB\java\common.jar;C:\xalan-j_2_4_0\bin\xalan.jar;C:\xalan-j_2_4_0\bin\xml-apis.jar;C:\xalan-j_2_4_0\bin\xalansamples.jar;C:\xalan-j_2_4_0\bin\xercesImpl.jar
Mulla on käytössä j2sdk1.4.2_06.
Viittaako virtuaalikoneen antama ilmoitus, ettei se löydä harjoitussovellukseni käyttämiä luokkia,
luokkapolusta kerrotuista jar-tiedostoista?
Mitä yllä oleva JVM:n ilmoitus tarkalleen tarkoittaa?
Tässä muuten yksi J2EE framework jos kiinnostaa:
http://www.springframework.org/
Otin toimivat esimerkkisoftat, ne kääntyivät hyvin koneessani, itse serveripään softan asensin tomcat:iin luotuun wepapps:n alla olevaan axis hakemistoon .jws-luokkana.
Ajaessani ohjelmaa java-komennolla virtuaalikone
ilmoittaa seuraavan ongelman:
Exception in thread "main" java.lang.UnsupportedClassVersionError: HarjoitusClient
(Unsupported major.minor version 49.0)
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Ajettavassa ohjelmassa käytetään näitä luokkia:
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
Olen asettaunt WIN XP:n ohjauspaneelin kautta CLASSPATH:lle yllä käytettyjä luokkia vastaavan polkumäärityksen, joka on luokkapolun alussa.
. ;C:\axis-1_1\lib\axis.jar;C:\axis-1_1\lib\jaxrpc.jar;C:\axis-1_1\lib\saaj.jar;C:\axis-1_1\lib\commons-logging.jar;C:\axis-1_1\lib\commons-discovery.jar;C:\axis-1_1\lib\wsdl4j.jar;%CLASSPATH%;%CATALINA_HOME%\bin\startup;%JAVA_HOME%\bin;%JAVA_HOME%\lib;%JAVA_HOME%;%CATALINA_HOME%\common\lib\servlet.jar;C:\Sun\AppServer\jdk\lib\J2ee.jar;C:\Sun\AppServer\jdk\bin;C:\Sun\AppServer\jdk\lib;C:\Program Files\Java\jdk1.5.0_01\bin;C:\Program Files\Java\jdk1.5.0_01\lib;C:\SolidSDKe352\jdbc\SolidDriver2.0.jar;\c:;C:\PROGRA~1\IBM\SQLLIB\java\db2java.zip;C:\PROGRA~1\IBM\SQLLIB\java\db2jcc.jar;C:\PROGRA~1\IBM\SQLLIB\java\sqlj.zip;C:\PROGRA~1\IBM\SQLLIB\java\db2jcc_license_cu.jar;C:\PROGRA~1\IBM\SQLLIB\bin;C:\PROGRA~1\IBM\SQLLIB\tools\db2XTrigger.jar;C:\PROGRA~1\IBM\SQLLIB\java\common.jar;C:\xalan-j_2_4_0\bin\xalan.jar;C:\xalan-j_2_4_0\bin\xml-apis.jar;C:\xalan-j_2_4_0\bin\xalansamples.jar;C:\xalan-j_2_4_0\bin\xercesImpl.jar
Mulla on käytössä j2sdk1.4.2_06.
Viittaako virtuaalikoneen antama ilmoitus, ettei se löydä harjoitussovellukseni käyttämiä luokkia,
luokkapolusta kerrotuista jar-tiedostoista?
Mitä yllä oleva JVM:n ilmoitus tarkalleen tarkoittaa?
Tässä muuten yksi J2EE framework jos kiinnostaa:
http://www.springframework.org/
Vastaukset 6
Vanhimmat
Tod.näk. tomcat ja sovelluksesi käyttävät eri Java versiota. Ts. Tomcat käyttää java 1.4 ja sovelluksesi on käännetty javac 1.5. Käännä sovellukset uudelleen käyttäen javac 1.4:ää.
JVM:n ilmoitus tarkoittaa, että class-tiedoston rakenne ei ole "yhteensopiva".
Kerro auttoiko kääntäjän vaihtaminen?
Joo, huomasin ongelman eclipsen kautta, eclipseen oli vaihtunut asentamain Oraclen omassa hakemistossa oleva jdk, samoin minulla oli vielä yksi jdk 1.4 versio. poistin ne ja pistin ympäristömuuttujan JAVAHOME ja mysl CLASSPATH:n osoittamaan jdk 1.5:een.
Sovellus käynnistyi, mutta ei ihan ongelmitta.
Alla on poikkeus ja sovelluksen koodit.
Alla oleva Laskuri sijaitsee:
C:\Program Files\Apache Group\Tomcat 4.1\webapps\axis
hakemistossa.
public class Laskuri
{
public int lisaa(int luku1, int luku2)
{
return luku1 luku2;
}
public int vahenna(int luku1, int luku2)
{
return luku1 - luku2;
}
}
Alla oleva LaskuriClient sijaitsee:
C:\temp
hakemistossa
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
public class LaskuriClient
{
public static void main(String [] args)
{
Integer luku1;
Integer luku2;
String operaattori;
QName operaatio = null;
String endpoint = "http://localhost:8080/axis/Laskuri.jws";
try{
operaattori = " ";
luku1 = new Integer(5);
luku2 = new Integer(6);
if(operaattori.equals(" "))
operaatio = new QName("lisaa");
else if(args[1].equals("-"))
operaatio = new QName("vahenna");
else
throw new Exception();
}
catch(Exception e)
{
System.out.println("LaskuriClient luku1 /- luku2");
return;
}
try{
Service service = new Service();
Call call = (Call)service.createCall();
call.setTargetEndpointAddress( new java.net.URL(endpoint) );
call.setOperationName(operaatio);
Integer tulos = (Integer) call.invoke(new Object[] {luku1, luku2});
System.out.println(" Tulos on " tulos);
}
catch(Exception e)
{
System.out.println("**** Virhe");
e.printStackTrace();
return;
}
}
}
Hmmm... mielenkiintoista ajaessani ohjelmaa
komennolla C:\temp>java LaskuriClient 4 5
huomasin, että Tomcat:n konsoliin tuli:
- Unable to find config file. Creating new servlet engine config file: /WEB-INF
/server-config.wsdd
Saattaa olla vihje ongelmasta?
Kuitenkin ko. pienien testisoftien pitäisi toimia, kun palvelin pään softan tallentaa
C:\Program Files\Apache Group\Tomcat 4.1\webapps\axis
-hakemistoon
ja asiakaspään softan ihan minne haluaa.
Olen nähnyt näiden softien toimivan kouluympäristössä, mitään muuta konfigurointeja
tai asetustiedostoja ei asetettu ainoastaan luokkapolkumääritys viriteltiin.
Mitään muuta siellä ei tehty kuin vähän viriteltiin CLASSPATH:ia.
Itse poikkeuksen virheilmoitus:
**** Virhe
AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: java.net.ConnectException: Connection refused: connect
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}stackTrace: java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:364)
at java.net.Socket.connect(Socket.java:507)
at java.net.Socket.connect(Socket.java:457)
at java.net.Socket.(Socket.java:365)
at java.net.Socket.(Socket.java:178)
at org.apache.axis.components.net.DefaultSocketFactory.create(DefaultSocketFactory.java:129)
at org.apache.axis.transport.http.HTTPSender.getSocket(HTTPSender.java:157)
at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:114)
at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:71)
at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:150)
at org.apache.axis.SimpleChain.invoke(SimpleChain.java:120)
at org.apache.axis.client.AxisClient.invoke(AxisClient.java:180)
at org.apache.axis.client.Call.invokeEngine(Call.java:2564)
at org.apache.axis.client.Call.invoke(Call.java:2553)
at org.apache.axis.client.Call.invoke(Call.java:2248)
at org.apache.axis.client.Call.invoke(Call.java:2171)
at org.apache.axis.client.Call.invoke(Call.java:1691)
at LaskuriClient.main(LaskuriClient.java:43)
java.net.ConnectException: Connection refused: connect
at org.apache.axis.AxisFault.makeFault(AxisFault.java:129)
at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:131)
at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:71)
at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:150)
at org.apache.axis.SimpleChain.invoke(SimpleChain.java:120)
at org.apache.axis.client.AxisClient.invoke(AxisClient.java:180)
at org.apache.axis.client.Call.invokeEngine(Call.java:2564)
at org.apache.axis.client.Call.invoke(Call.java:2553)
at org.apache.axis.client.Call.invoke(Call.java:2248)
at org.apache.axis.client.Call.invoke(Call.java:2171)
at org.apache.axis.client.Call.invoke(Call.java:1691)
at LaskuriClient.main(LaskuriClient.java:43)
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:364)
at java.net.Socket.connect(Socket.java:507)
at java.net.Socket.connect(Socket.java:457)
at java.net.Socket.(Socket.java:365)
at java.net.Socket.(Socket.java:178)
at org.apache.axis.components.net.DefaultSocketFactory.create(DefaultSocketFactory.java:129)
at org.apache.axis.transport.http.HTTPSender.getSocket(HTTPSender.java:157)
at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:114)
... 10 more
Tää SOAP- ja Axis-maailma on mulle aika uusi juttu, olen vähän pallo hukassa näiden virittelyjen kanssa.
Just hät hätään olen kohtuullisesti oppinut virittelemään servletit, JSP:t (beanit), vähän DOM:ia ja J2ME:tä.
Nää on mielenkiintoisia juttuja ;)
Täytyy vielä ihmetellä, kiitoksia neuvoista.
Jos joku hoksaa mikä ongelma on vielä ton poikkeuksen aiheuttaja softassa, olisin kiitollinen. Yritän tässä itse jäljittää ongelmaa. Voi olla aika helppo, kun asia on mulle uusi.
No äkkiseltään tulee mieleen, että serveri ei ehkä kuuntele sitä porttia mihin sovellus yrittää ottaa yhteyttä. Eli tarkista osoite ja portti... ;)
Taidan aavistaa virheen, severi minusta kuuntelee oikeaa porttia. Se toimii muiden servlettien kanssa.
Katos tämä ilmoitus kun kysäsin virtuaalikoneelta JDK-version:
C:\>java -version
java version "1.4.2_06"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_06-b03)
Java HotSpot(TM) Client VM (build 1.4.2_06-b03, mixed mode)
Poistin ylimääräisiä JDK, JRE-versioita, joita tarvitsin muiden sovellusten kanssa. Jätin vielä J2EE 1.4 version ja asensin JDK 1.4.2_06:n.
Kuitenkin ilmoitetaan JRE 1.4.2_06-b03:sta.
Täytyy etsiä se missä se on, ohjauspaneelista en huomannut, täytyy tsekata uudestaan ja poistaa se.
Toi mixed mode on epäilystä herättävä juttu, eli tarkoittaakohan se että virtuaalikone yhdistää eri JDK ja JRE-versioista osia (luokkia ja paketteja)?
Jos näin on, niin ongelmahan voikin olla siinä, koska ei ole takeita siitä että on sovelluksella oikeat luokat käytössä jos eri versioista virtuaalikone kasaa luokat?
Hmmm...tästä saattaa oppiakin jotakin.
Etsin kaikki mahdolliset jdk ja jre versiot ja heitän mäkeen ne, otan vain yhden version käyttöön.
Myöhemmin vaihdan jdk 1.5:n kun vaihdan Tomcat-versiota.
Voi olla että Tomcat 4.1 käyttäessään JDK 1.4:sta
näiden pakettien ja luokkien kanssa
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
käyttääkin väärää versiota JDK:sta (tai JRE).
Tähän sitten tää mixed-mode versio joka on koneessa käynnissä keikahtaakin.
Täytyy selvittää ongelmaa.
En ole ehtinyt lukemaan noita erroreita, mutta semmonen juttu ainakin, että Axis 1.1 ja java 1.5 ei sovellu yhteen. Eli käytä mielummin java 1.4.x:ää sekä asiakas- että palvelinpäässä.
Kikkailulla saa kyllä tuonkin parin toimimaan, mutta ei muistaakseni suoraan.
Poistin kaikki vanhat versiot, joku JRE vanha versio lähti kummittelemaan.
Sain neuvoksi poistaa käännetyn class-tiedoston.
Käänsin ohjelman uudestaan ja ajoin sen, se lähti toimimaan.
Oli käännetty toimimattomalla java-versiolla.
Olipas taas kova vääntö asian kanssa, nyt sitten Axis:in ja SOAP-juttujen kimppuun taas :)