Avatar billede javatosse Nybegynder
25. april 2006 - 22:42 Der er 8 kommentarer og
1 løsning

RMI og pakker

Hej

Kan det passe at RMI kun fungerer hvis RMI-klasserne befinder sig i samme pakkestruktur på server og klient.
Hvis RMI-klasserne på serveren f.eks. befinder sig i pakken "server" og RMI-klasserne på klienten befinder sig i pakken "pakke" får jeg følgende exception:

java.lang.ClassCastException: HelloImpl_Stub
    at pakke.HelloClient.main(HelloClient.java:16)

Det virker lidt underligt da man jo sjældent har samme pakkestruktur på både server og klient

Håber nogen har et svar på dette problem, da jeg ikke går udfra jeg er den første der har oplevet dette :)

På forhånd tak!
Avatar billede javatosse Nybegynder
25. april 2006 - 22:47 #1
Undskyld...Exceptionen er følgende:

java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
    java.lang.ClassNotFoundException: server.HelloImpl_Stub (no security manager: RMI class loader disabled)
    at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
    at pakke.HelloClient.main(HelloClient.java:16)
Caused by: java.lang.ClassNotFoundException: server.HelloImpl_Stub (no security manager: RMI class loader disabled)
    at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
    at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
    at java.rmi.server.RMIClassLoader$2.loadClass(Unknown Source)
    at java.rmi.server.RMIClassLoader.loadClass(Unknown Source)
    at sun.rmi.server.MarshalInputStream.resolveClass(Unknown Source)
    at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
    at java.io.ObjectInputStream.readClassDesc(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
Avatar billede arne_v Ekspert
25. april 2006 - 22:48 #2
Det er korrekt.

Jeg anbefaler normalt mindst 3 pakker:
  en med de server specifikke klasser
  en med de client specifikke klasser
  en med de delte klasser

Laes evt. http://www.eksperten.dk/artikler/225
Avatar billede arne_v Ekspert
25. april 2006 - 22:50 #3
Fejlen skyldes at du ikke har nogen security manager i din client og at client
derfor ikke vil downloade klasser fra server.

Du boer overveje en security manager - af sikkerheds hensyn.

Download af klasser fra server anbefales af SUN, men jeg har altid fundet det
nemmere at distribuere faelles klasserne til client.

Ovennaevnte artikel kommer som sagt ind paa en del af disse emner.
Avatar billede javatosse Nybegynder
25. april 2006 - 22:54 #4
ok...det er da en stor ulæmpe hvis man ønsker en ordentlig softwarearkitektur...øv...tak for hjælpen :)
Smid et svar og du får point
Avatar billede javatosse Nybegynder
25. april 2006 - 22:57 #5
Er det korrekt at du mener at det er lettere selv at søge for distributionen af klasse-filerne istedet for at bruge Dynamic Classloading?
Avatar billede arne_v Ekspert
25. april 2006 - 23:02 #6
tigtly coupled protokoller som RMI, EJB eller .NET remoting kraever nogle
klasser/interfaces som er kendt paa baade client og server

loosely coupled protokoller som f.eks. web services (SOAP over HTTP) behoever det ikke

----

svar

----

Ja. Det er nemmere. Og jeg har aldrig set det store formaal med den dynamiske
loading.
Avatar billede javatosse Nybegynder
25. april 2006 - 23:19 #7
Jeg må indrømme at jeg godt kan se fordelen ved dynamic classloading, hvis man har mange clienter og man f.eks. laver en ændring i den klasse der står for implementeringen af det fælles interface's metoder. Det er jo denne klasse stubben bliver lavet udfra, og dermed ville en ændring i denne klasse jo kræve at man lavede en ny stub, som så skulle overføres manuelt til alle klienterne. Med Dynamic classloading sker denne overførsel jo automatisk.
Men det er selvfølgelig klart at Dynamic classloading ikke løser problemmet hvis interfacet bliver ændret f.eks. ved tilføjelse af nye metoder.
Avatar billede arne_v Ekspert
25. april 2006 - 23:29 #8
Det er rigtigt.

Men i de fleste tilfaelde bruges RMI paa intranet, hvor man har muligheder for at
distribuere til alle virksomhedens PC'ere.

Og selv over internet er der jo f.eks. Java Web Start.

Men det er kun min mening. SUN bruger dynamisk classloading i alle deres
eksempler. Saa der er absolut ogsaa andre synspunkter.
Avatar billede javatosse Nybegynder
25. april 2006 - 23:38 #9
:) jeg er enig i at RMI er bedst egnet til intranetbrug, hvilket jo selvfølgelig letter distribueringen af de ændrede filer...hvis ellers alle virksomhedens PC'ere er tilstede når dette sker :)
Tak for snakken og hjælpen!
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