01. april 2003 - 09:33Der er
44 kommentarer og 1 løsning
Classpath problemer (runtime) med RMI og Fastobjects
Goddag Eksperter ! Følgende problem driver mig til kaffenarkomani:
Jeg er igang med at koble en objekt orienteret DB til et auktionssystem. DB'en er POETs Fastobjects. I min IDE er alle classpaths sat korrekt op, og programmet kompileres korrekt. Under runtime derimod, opstår denne fejl :
java.rmi.servererror : Error occured in server thread; nested exception is: java.lang.noclassdeffounderror: javax/jdo/spi/PersistenceCapable
Det mærkelige er - At denne fejl kun opstår periodevis. At og til virker det hele fint, for blot at gå ned igen efter næste kompilering.
Forberedelserne til en kørsel er således: 1) Koden kompileres 2) Der genereres stubbe via rmic 3) Der "enhances" via Fastobjects ptj (Tilskrivning til de persistente klassers bytecode) 4) kørsel - og fejl
Disse ting udføres via en BAT som ser således ud: ------------------------------------------------------ set path=C:\j2sdk1.4.0_02\bin;%path% set path=C:\j2sdk1.4.0_02\classes;%path%
ptj -enhance -inplace -update ----------------------------------------------------------- Hvor stien til C:\j2sdk1.4.0_02\classes fører til de .jar filer som Fastobjects kræver.
Hvem skulle have løsningen til denne runtime fejl?
Har nu forsøgt at sætte den classpath, så den sættes før rmiregistry kører. Dette krævede dog at jeg også satte path'en til min stub (i Serverny). Samtidig har jeg placeret enhance kommandoen i egen bat fil (enhance)
Dette giver dog det samme resultat : classdefnotfound..... som før beskrevet.
Fik jeg korrekt fat i dit forslag?
---------------------------------------------------- set path=C:\j2sdk1.4.0_02\bin;%path% set path=C:\j2sdk1.4.0_02\classes;%path%
Afviklingen klarer jeg igen fra IDE'en (dårlig vane). Jeg har checket at alle classpaths er som de skal være ved at indsætte dette i min program opstart:
System.getProperty("java.class.path")
Hvilket output ser korrekt ud.
Hvordan ville en run kommando med angivelse af classpath til "C:\j2sdk1.4.0_02\classes" se ud? hvis kørt fra kommandopromt?
I mellemtiden forsøgte jeg en ting som også er prøvet før. Tidligere i et andet rmi program, kunne det kun køre hvis rmiregistry.exe var placeret direkte i mappen med egen kode. Dette prøvede jeg igen igen - og nu kører skidtet igen!!!!!!. Problemet er dog at det sikkert ikke varer ved (utallige gen-kompileringer under udviklingen)
Det er som om vi svæver lige omkring løsningen, men rammer ikke helt !
Men det kører ikke - Og nu fik det spoleret det der før kørte (som forudsagt) Det virker til at være en kombination af genstarter, og skiftevis kørsel af rmiregistry.exe i lokal folder og i /bin folderen i JDK'en. Men jeg kan sgu' ikke sætte fingeren på fejlen.
Jeg tænker lige over det over en bid frokost - Er tilbage om 20.....
Fandt synderen! I bat filen lige rmic kompileringen var der netop en %PATH% indsat. Har nu trimmet den til, men det hjalp ikke. Dog er runtime exception'en nu :
C:\TestBed\ServerNy>java -classpath .;C:\j2sdk1.4.0_02\classes\jdo.jar;C:\j2s .4.0_02\classes\FastObjects_e7_JDO.jar;C:\TestBed\ServerNy ServerUpstart java.rmi.ServerError: Error occurred in server thread; nested exception is: java.lang.NoClassDefFoundError: javax/jdo/spi/PersistenceCapable
C:\>c:\j2sdk1.4.0_02\bin\jar tvf jdo.jar java.io.FileNotFoundException: jdo.jar (Den angivne fil blev ikke fundet) at java.io.FileInputStream.open(Native Method) at java.io.FileInputStream.<init>(FileInputStream.java:103) at java.io.FileInputStream.<init>(FileInputStream.java:66) at sun.tools.jar.Main.run(Main.java:185) at sun.tools.jar.Main.main(Main.java:904)
Så vidt jeg har forstået, så tilskrives den oprindelige .class fil fra build yderligere egenskaber af "enhance" kommandoen, her iblandt den berygtede persistencecapable egenskab. Derfor har jeg ikke engang selv muligheden for at tilskrive denne egenskab i .java klasserne, men er nødsaget til at stole på at "enhance" klarer dette. Hvilket den så klarer fint under udførelsen, men ikke under efterfølgende runtime. Så mon ikke det er en classloader under fastobjects som der er synderen??
Kan det være en klasse som persistencecapable afhænger af,der ikke kan findes, og fejlmeldingen skal tolkes som persistencecapable ikke kan findes (loades) da den anden klasse ikke kan findes?
Og jeg tror slet ikke at enhanceren er skyld i dette.
Et eller andet sted er der en referance til den klasse.
Det virker fint.
Vi kan bare ikke finde klassen på runtime.
Jeg spekulerer på om der er specielle regler a la "JDO SPI klasser skal loades fra en jar-fil som variabel JDO_LIB peger på" eller "JDO SPI klasser skal ligge i CLASSPATH variabel" eller noget i den stil.
Ja, den jdo.jar som omtales er placeret i en mappe kaldet runtime under Fastobject installationen. Her ligger også FastObjects_e7_JDO.jar. Disse to filer har jeg henvist til via classpath (ved denne placering i Fastobject installationen) men uden resultat.
Som forsøg flyttede jeg dem til jdk'en i mappen "classes" i håb om dette kunne have en effekt. Men som vi har erfaret, er dette også for lidt.
Men igen til det mærkelige, det har virket fra begge placeringer !!!! Men det kører kun en enkelt gang eller to, og er nede igen efter næste kompilering.
Det lyder som en frisk ide - Så hvorfor ikke. Jeg har også en frisk maskine som jeg kan ligge det ind på, så ser vi om det funker. Tager nok 1-2 timer før alt er klart - Jeg kommer med en status så snart den er klaret!
Og igen, tak for dialogen Arne - Man lærer jo altid !
Desværre ! Men en frisk maskine og en installation af J2sdk1.4.0 samt Fastobjects, opstod samme runtime fejl som før. Nu er jeg ved og være blank for nye ideer, og søger hjælp sideløbende hos Poet. Jeg holder denne åben for forslag indtil jeg får svar fra dem, forhåbentlig imorgen.
Glemte helt (i sin tid) at lukke spørgsmålet - Jeg beklager!
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.