Toon posts:

[Java] RMI met j2se 1.5

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben aan het proberen om wat voorbeelden met rmi werkend te krijgen.
Ik gebruik java versie 1.5. Volgens de documentatie hoef je vanaf deze versie
geen gebruik te maken van de stub compiler.

Hier staat de tutorial waar ik mee bezig ben:
http://java.sun.com/j2se/1.5.0/docs/guide/rmi/index.html

Daarin word het volgende stukje code voor de Server gebruikt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Server implements Hello {

public Server() {}

public String sayHello() {
return "Hello, world!";
}

public static void main(String args[]) {

try {
    Server obj = new Server();
    Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0);

    // Bind the remote object's stub in the registry
    Registry registry = LocateRegistry.getRegistry();
    registry.bind("Hello", stub);

    System.err.println("Server ready");
} catch (Exception e) {
    System.err.println("Server exception: " + e.toString());
    e.printStackTrace();
}
}
}


Als ik deze probeer op te starten krijg ik deze error:
code:
1
2
3
erver exception: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: example.hello.Hello


De code heb ik letterlijk gekopieert uit de tutorial.
Na wat zoekwerk lijkt deze fout toch te maken te hebben met de "codebase".
Iets wat dus niet meer zou hoeven met deze versie...
Iemand enig idee?

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Als je bovenin de voorbeeld files kijkt, dan zie je daar een regeltje staan met:
Java:
1
package example.hello;


Packages worden gebruikt voor de indeling van je class files in een logische structuur. De folder structuur die je hanteert moet gelijk zijn aan deze structuur. Dus, je moet de volgende folderstructuur aanmaken:
code:
1
2
3
<een folder die je leuk vindt>
-> example
    -> hello

In de hello folder zet je je bestanden neer.
Run je files vanuit <een folder die je leuk vind> als volgt:
java /example/hello/Server
etc...

edit:
ps: Als dit je niet bekend voorkomt is het misschien zaak om eerst wat basic Java kennis op te gaan doen, voordat je gaat stoeien met RMI ;)
edit2: Ik neem trouwens aan dat je Hello.java wel hebt gecompileerd? Anders zou de fout em daar ook nog in kunnen zitten.

[ Voor 28% gewijzigd door bigbeng op 20-12-2004 09:07 ]


Verwijderd

Topicstarter
Bedankt voor je reactie, maar dit had ik al goed staan.
Ik ben goed bekend met java in het algemeen, maar nog nooit eerder iets met rmi gedaan.
Uiteraard is Hello ook wel gecompileerd :z

Verwijderd

Misschien moet die map waar Hello in staat in je classpath staan :?

Verwijderd

Topicstarter
Verwijderd schreef op maandag 20 december 2004 @ 10:04:
Misschien moet die map waar Hello in staat in je classpath staan :?
Dat staat ie :)

  • JaWi
  • Registratie: Maart 2003
  • Laatst online: 14-01 21:58

JaWi

maak het maar stuk hoor...

Verwijderd schreef op zondag 19 december 2004 @ 22:45:
De code heb ik letterlijk gekopieert uit de tutorial.
Na wat zoekwerk lijkt deze fout toch te maken te hebben met de "codebase".
Iets wat dus niet meer zou hoeven met deze versie...
Iemand enig idee?
Hmm, kan nergens zo snel vinden dat de "codebase" niet meer gezet zou hoeven worden. Sterker nog, ik zie het Sun zelf in de door jouw genoemde tutorial doen...

Anyway: ik krijg de server wel draaiende als ik de server als volgt opstart:

Bash:
1
java -Djava.rmi.server.codebase="file://`pwd`/" -cp . example.hello.Server


N.B.: Die laatste slash is van belang!

Statistics are like bikinis. What they reveal is suggestive, but what they hide is vital.


Verwijderd

Topicstarter
Dit is hoe ze in die tutorial de server starten:
code:
1
start java -classpath classDir example.hello.Server


Zonder codebase dus.
Maar ik zal het vanavond thuis proberen of het dan wel werkt, en het resultaat even posten :)

[ Voor 3% gewijzigd door Verwijderd op 20-12-2004 11:40 ]


Verwijderd

Topicstarter
Super hij doet het! :)
Inderdaad werkt het wel als je de codebase meegeeft.
Wat ik me nu alleen afvraag, is dit nu gewoon een fout in die tutorial, of zou het eigenlijk wel zonder moeten kunnen?

[ Voor 6% gewijzigd door Verwijderd op 20-12-2004 21:49 ]


Verwijderd

De tutorials van Sun lopen idd af en toe wel eens wat anders dan de realiteit..ik denk dat het in dit geval echter geen fout is en dat het ook zou moeten werken als zowel de server als de client Java 1.5 draaien.

De tutorial linkt ook naar:
http://java.sun.com/j2se/1.5.0/docs/guide/rmi/codebase.html
voor de codebase. De codebase zou dus alleen nodig moeten zijn voor pre 1.5 clients.

Verwijderd

Topicstarter
Juist dat begreep ik er ook uit.
Maar ik draait toch echt alleen maar 1.5, ik snap dus niet waarom het dan toch niet werkt.

Verwijderd

misschien komt die exception omdat je rmi-registry nog niet/niet goed draait?
die moet namelijk jouw code in z'n classpath kunnen vinden.

en hier wordt expliciet gezegd dat je je codebase goed moet controleren als je zo'n server error krijgt.

ik heb namelijk nergens zien staan dat die codebase niet nodig is maar wel onderstaande quote
waarin wordt gezegd dat je je stubs niet meer hoeft te pre-compilen voor clients vanaf 5.0 (zoals je al zei.)

mijn idee is dus dat je er ff overheen hebt gelezen de docs brak zijn... ;)
Note: As of the J2SE 5.0 release, stub classes for remote objects no longer need to be pregenerated using the rmic stub compiler, unless the remote object needs to support clients running in pre-5.0 VMs. If your application needs to support such clients, you will need to generate stub classes for the remote objects used in the application and deploy those stub classes for clients to download. For details on how to generate stub classes, see the tools documentation for rmic

[ Voor 27% gewijzigd door Verwijderd op 28-12-2004 11:54 ]

Pagina: 1