Avatar billede diveguy Nybegynder
01. april 2003 - 09:33 Der 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%

C:\j2sdk1.4.0_02\bin\rmic -classpath C:\TestBed\ServerNy Auktionarius

C:\j2sdk1.4.0_02\bin\rmic -classpath C:\TestBed\Klient AuktionsHandler

start C:\j2sdk1.4.0_02\jre\bin\rmiregistry.exe

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?
Avatar billede arne_v Ekspert
01. april 2003 - 10:01 #1
Først et par betragtninger irrelevant for problemet:

1)  Du er den første jeg kender der faktisk er gået i gang med JDO.
2)  Jeg ville ikk ehave smidt ikke-JDK ting i JDK træet.
Avatar billede arne_v Ekspert
01. april 2003 - 10:03 #2
Mit bedste gæt er at JDO klasserne skal være
i classpath for RMIRegistry og at det er lidt "tilfældigt" om
de er det.

Så prøv og lav RR.bat med:

set CLASSPATH=wherever-jdo-er
rmiregistry

og så brug:

start RR.bat
Avatar billede diveguy Nybegynder
01. april 2003 - 10:36 #3
Dav Arne

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%

C:\j2sdk1.4.0_02\bin\rmic -classpath C:\TestBed\ServerNy Auktionarius

C:\j2sdk1.4.0_02\bin\rmic -classpath C:\TestBed\Klient AuktionsHandler

start enhance

set CLASSPATH=C:\j2sdk1.4.0_02\classes;%path%
set CLASSPATH=C:\TestBed\ServerNy;%path%

C:\j2sdk1.4.0_02\bin\rmiregistry
-------------------------------------------------------
Avatar billede arne_v Ekspert
01. april 2003 - 10:54 #4
Du kører 3 processer:
  RMIRegistry
  din server
  din client

Og de har alle 3 sat classpathen til at inkludere JDO klasserne ?
Avatar billede diveguy Nybegynder
01. april 2003 - 11:11 #5
Der er kun sat path til jdo klasserne to steder

(set CLASSPATH=C:\j2sdk1.4.0_02\classes;%path%)

i "enhance" er der ikke sat classpath. Den indeholder blot:
ptj -enhance -inplace -update

Igår, da alt virkede - Var disse ikke engang sat. Path'en til JDO var kun
sat i IDE'ens classpath for projektet.

Har du et forslag til en samlet .bat fil ? Jeg er ikke så hård til dem, da jeg normalt klarer alt fra IDE'en.
Avatar billede arne_v Ekspert
01. april 2003 - 11:15 #6
Jeg tror jeg er lidt forvirret.

rmic og enhance er vel en del af build ikke en del af run ?

Jeg taler om ren run.

(da jeg formoder at build virker fint)
Avatar billede diveguy Nybegynder
01. april 2003 - 11:24 #7
Korrekt - rmic og enhance er del af build.

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?
Avatar billede arne_v Ekspert
01. april 2003 - 11:33 #8
java -classpath .;C:\j2sdk1.4.0_02\classes ClientMain

java -classpath .;C:\j2sdk1.4.0_02\classes ServerMain
Avatar billede diveguy Nybegynder
01. april 2003 - 11:41 #9
Sorry, jeg har vist udtrykt mig for svævende.

I "C:\j2sdk1.4.0_02\classes" har jeg placeret de .jar filer som Fastobjects kræver - eks. jdo.jar

Min kode befinder sig i "C:\TestBed\ServerNy"

Ellers ville du sikkert undre dig over de path settings der er i bat filen.

Med de forudsætninger vil kommandopromt rum kommando vel hedde:

java -classpath .;C:\j2sdk1.4.0_02\classes C:\TestBed\ServerNy ServerMain

Forsøgte lige denne udgave - Men stadig noclassdeffound.....
Avatar billede arne_v Ekspert
01. april 2003 - 12:50 #10
Der manglet et semikolon, men det er fornmentlig en tyrk-fejl
i kommentaren:
java -classpath .;C:\j2sdk1.4.0_02\classes;C:\TestBed\ServerNy ServerMain
Avatar billede arne_v Ekspert
01. april 2003 - 12:51 #11
Øh.

Skulle det iøvrigt ikke være:

java -classpath .;C:\j2sdk1.4.0_02\classes\jdo.jar;C:\j2sdk1.4.0_02\classes\something.jar;C:\TestBed\ServerNy ServerMain

?
Avatar billede arne_v Ekspert
01. april 2003 - 12:51 #12
[classpath peger på directory med class filer - eller jar filer - men ikke
directories med jar filer]
Avatar billede diveguy Nybegynder
01. april 2003 - 12:55 #13
Ja det var "tyrk"er !

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 !
Avatar billede diveguy Nybegynder
01. april 2003 - 12:56 #14
Prøver lige det sidste forslag Arne !
Avatar billede arne_v Ekspert
01. april 2003 - 13:06 #15
Hvis RMIRegistry kun kører hvis den køres i mappen med din kode, så
lyder det jo som om at du ikke får sat CLASSPATH rigtigt for
den process.
Avatar billede diveguy Nybegynder
01. april 2003 - 13:08 #16
Nix !  Run kommandoen med udfyldte parametre hedder:

java -classpath .;C:\j2sdk1.4.0_02\classes\jdo.jar;C:\j2sdk1.4.0_02\classes\FastObjects_e7_JDO.jar;C:\TestBed\ServerNy ServerUpstart

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.....
Avatar billede diveguy Nybegynder
01. april 2003 - 13:52 #17
Til Arne v

Tænkte om det mon var en form for konflikt i registreringsdatabasen?
Jeg tog følgende dump af runtime exception'en:

Exception in thread "main" java.lang.NoClassDefFoundError: ServerUpstart;C:\j2sd
k1/4/0_02\bin;C:\j2sdk1/4/0_02\classes;C:\j2sdk1/4/0_02\bin;C:\WINDOWS\system32;
C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Programmer\Rational\ClearQuest;C:\Program
mer\Rational\common;C:\Programmer\Rational\Rose\TopLink\;C:\Programmer\FastObjec
ts_Trial\runtime\bin;C:\Programmer\FastObjects_Trial\bin


Er der noget her du mener ser forkert ud?
Avatar billede arne_v Ekspert
01. april 2003 - 13:56 #18
Ja.

Der er noget riv ruskende galt !

Den tror at classpath er navnet på den klasse der skal køres.
Avatar billede diveguy Nybegynder
01. april 2003 - 13:57 #19
Uddyb !
Avatar billede arne_v Ekspert
01. april 2003 - 13:58 #20
Er opstarts kommandoen præcis:

java -classpath .;C:\j2sdk1.4.0_02\classes\jdo.jar;C:\j2sdk1.4.0_0\classes\FastObjects_e7_JDO.jar;C:\TestBed\ServerNy ServerUpstart

?
Avatar billede diveguy Nybegynder
01. april 2003 - 13:59 #21
Yep
Avatar billede arne_v Ekspert
01. april 2003 - 13:59 #22
Den leder efter klassen:

ServerUpstart;C:\j2sdk1/4/0_02\bin;C:\j2sdk1/4/0_02\classes;C:\j2sdk1/4/0_02\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Programmer\Rational\ClearQuest;C:\Programmer\Rational\common;C:\Programmer\Rational\Rose\TopLink\;C:\Programmer\FastObjects_Trial\runtime\bin;C:\Programmer\FastObjects_Trial\bin
Avatar billede arne_v Ekspert
01. april 2003 - 14:01 #23
Det ligner nærmest noget i retning af:

java -classpath .;C:\j2sdk1.4.0_02\classes\jdo.jar;C:\j2sdk1.4.0_0\classes\FastObjects_e7_JDO.jar;C:\TestBed\ServerNy ServerUpstart;%CLASSPATH%
Avatar billede arne_v Ekspert
01. april 2003 - 14:02 #24
Eller måske:

java -classpath .;C:\j2sdk1.4.0_02\classes\jdo.jar;C:\j2sdk1.4.0_0\classes\FastObjects_e7_JDO.jar;C:\TestBed\ServerNy ServerUpstart;%PATH%
Avatar billede diveguy Nybegynder
01. april 2003 - 14:08 #25
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
Avatar billede diveguy Nybegynder
01. april 2003 - 14:12 #26
Samlet ser BAT'en sådan ud:

C:\j2sdk1.4.0_02\bin\rmic -classpath C:\TestBed\ServerNy Auktionarius
C:\j2sdk1.4.0_02\bin\rmic -classpath C:\TestBed\Klient AuktionsHandler
start C:\j2sdk1.4.0_02\bin\rmiregistry
start enhance
pause
java -classpath .;C:\j2sdk1.4.0_02\classes\jdo.jar;C:\j2sdk1.4.0_02\classes\FastObjects_e7_JDO.jar;C:\TestBed\ServerNy ServerUpstart
pause

Hvor "enhance" er en seperat BAT kun med enhance kommandoen
Avatar billede arne_v Ekspert
01. april 2003 - 14:14 #27
OK.

Nu kan den ikke finde: javax.jdo.spi.PersistenceCapable !

Er den i en af de 2 jar filer ?  (kan verificeres med jar tvf)
Avatar billede diveguy Nybegynder
01. april 2003 - 14:21 #28
Hmm - Har aldrig prøvet lige den før.
Skulle kommandoen ved kommandopromt så være :

jar tvf jdo.jar

Hvis ja - Genkendes det ikke som en intern eller extern kommando
Avatar billede arne_v Ekspert
01. april 2003 - 14:22 #29
Du har nok ikke den i path'en så.

C:\j2sdk1.4.0_02\bin\jar tvf jdo.jar
Avatar billede arne_v Ekspert
01. april 2003 - 14:23 #30
Uundværligt til at check om jar-filer nu indeholder det man tror de indeholder.
Avatar billede diveguy Nybegynder
01. april 2003 - 14:27 #31
Nu føler jeg mig rigtigt som en amatør!

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)
Avatar billede arne_v Ekspert
01. april 2003 - 14:30 #32
Hvis ikke du står i det directory, hvor den ligger skal du bruge:

c:\j2sdk1.4.0_02\bin\jar tvf C:\j2sdk1.4.0_02\classes\jdo.jar

(jar er et ganske almindeligt program)
Avatar billede diveguy Nybegynder
01. april 2003 - 14:33 #33
Ok - tænkte mig lige om og fandt ud at mam selvfølgeligt skulle angive stien til filens placering  også (Tror jeg mangler kaffe)

Og ja , jdo.jar indeholder javax.jdo.spi.PersistenceCapable
Avatar billede arne_v Ekspert
01. april 2003 - 14:39 #34
Det er ikke godt.

Vi anbringer den i classpath, men den bliver ikke brugt.

Det lyder som om at enten er der fejl i JDK eller så bruges
der en special classloader der kigger efter klasser et andet sted.
Avatar billede diveguy Nybegynder
01. april 2003 - 14:46 #35
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??
Avatar billede diveguy Nybegynder
01. april 2003 - 14:51 #36
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?
Avatar billede arne_v Ekspert
01. april 2003 - 14:54 #37
Nej.

Den fejl betyder at en classloader er blevet bedt om at loade den
klasse og ikke kunne finde den.
Avatar billede arne_v Ekspert
01. april 2003 - 14:56 #38
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.
Avatar billede diveguy Nybegynder
01. april 2003 - 15:00 #39
Jeg går lige igennem fastobjects vidensbase en gang til. En eller anden
må da have rendt på det her før.

PS : Tak for den store hjælpe runde du har gang i
Avatar billede diveguy Nybegynder
01. april 2003 - 15:25 #41
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 er yderst sært alt sammen !
Avatar billede arne_v Ekspert
01. april 2003 - 15:31 #42
Et meget meget langt ude gæt: kunne du prøve at downloade JDK 1.4.1_01
og prøve med den ?

[der er flere som har set diverse mærkeligt ting med 1.4.1_02]
Avatar billede diveguy Nybegynder
01. april 2003 - 15:43 #43
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 !
Avatar billede diveguy Nybegynder
01. april 2003 - 18:53 #44
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.
Avatar billede diveguy Nybegynder
20. januar 2004 - 20:22 #45
Glemte helt (i sin tid) at lukke spørgsmålet - Jeg beklager!
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester