Avatar billede javaknold Nybegynder
14. april 2003 - 20:21 Der er 27 kommentarer og
1 løsning

Packages/ RMI, hvad gør jeg forkert ?

Har følgende struktur: d:\dir1\dir2\dir3

serverdel:

package dir1.dir2.dir3;
public class RMIserverImpl extends java.rmi.server.UnicastRemoteObject {
  //.............
}
Avatar billede javaknold Nybegynder
14. april 2003 - 20:23 #1
package dir1.dir2.dir3;
public class RMIserverImpl extends java.rmi.server.UnicastRemoteObject {
  //.............
}

Ovenstående kompilerer fint fra cmd
d:\dir1\dir2\dir3> javac -classpath d:\ RMIserverImpl.java

Men jeg kan ikke lave min Stub-fil med følgende:
d:\dir1\dir2\dir3>rmic -v1.2 -classpath d:\ RMIserverImpl

Hvad gør jeg galt ?
Avatar billede arne_v Ekspert
14. april 2003 - 20:24 #2
Hvad er problemet ?
Avatar billede arne_v Ekspert
14. april 2003 - 20:25 #3
Hvilken fejl får du ?
Avatar billede arne_v Ekspert
14. april 2003 - 20:26 #4
Normalt vil en RMI server implementation udover at extende
UnicastRemoteObject også implemnetere RMI server interfacet.
Avatar billede javaknold Nybegynder
14. april 2003 - 20:29 #5
Jeg kan dog godt lave Stub-filen via min IDE

Når jeg har startet rmiregistry og forsøger mig med
d:\dir1\dir2\dir3>java -classpath d:\ RMIserverImpl
for jeg fejlen: Exception in thread "main" java.lang.NoClassDefFoundError: RMIserverImpl

MEN filen ligger i den package
Avatar billede javaknold Nybegynder
14. april 2003 - 20:30 #6
Jeg implementerer også RMI interfacet ctrl+c og ctrl+v gik lidt hurtigt
Avatar billede arne_v Ekspert
14. april 2003 - 20:30 #7
Altså du har 3 .java filer:

RMIserverImpl.java
RMIserver.java
RMIclient.java

?
Avatar billede javaknold Nybegynder
14. april 2003 - 20:31 #8
Yes, i samme package
Avatar billede arne_v Ekspert
14. april 2003 - 20:37 #9
Prøv med:

d:\dir1\dir2\dir3>rmic -v1.2 -classpath d:\ dir1.dir2.dir3.RMIserverImpl
Avatar billede arne_v Ekspert
14. april 2003 - 20:38 #10
Eller endnu bedre:

d:\>rmic -v1.2 -classpath d:\ dir1.dir2.dir3.RMIserverImpl

(rmic putter selv ned i directoriene)
Avatar billede javaknold Nybegynder
14. april 2003 - 20:43 #11
Giver følgende resultat:

error: File d:\dir1\dir2\dir3\RMIserverImpl.class does not contain type
dir1\dir2\dir3\RMIserverImpl as expected, but type unique2.system.connec
t.RMIserverImpl. Please remove the file, or make sure it appears in the correct
subdirectory of the class path.
error: Class dir1\dir2\dir3\RMIserverImpl not found.
2 errors


Hvis jeg fjerner: package dir1.dir2.dir3;
fra alle tre filer, så kører det !!
Avatar billede arne_v Ekspert
14. april 2003 - 20:43 #12
Eksempel:

C:\e\dir1\dir2\dir3>dir
Volume in drive C is ARNEPC2_C
Volume Serial Number is E09B-1D63

Directory of C:\e\dir1\dir2\dir3

14/04/2003  20:41      <DIR>          .
14/04/2003  20:41      <DIR>          ..
14/04/2003  20:34                  191 RMIserver.java
14/04/2003  20:33                  651 RMIserverImpl.java
              2 File(s)            842 bytes
              2 Dir(s)  5,942,009,856 bytes free

C:\e>type build.bat
javac -classpath C:\e dir1\dir2\dir3\RMIserver.java
javac -classpath C:\e dir1\dir2\dir3\RMIserverImpl.java
rmic -classpath C:\e dir1.dir2.dir3.RMIserverImpl
C:\e>build

C:\e>javac -classpath C:\e dir1\dir2\dir3\RMIserver.java

C:\e>javac -classpath C:\e dir1\dir2\dir3\RMIserverImpl.java

C:\e>rmic -classpath C:\e dir1.dir2.dir3.RMIserverImpl

C:\e\dir1\dir2\dir3>dir
Volume in drive C is ARNEPC2_C
Volume Serial Number is E09B-1D63

Directory of C:\e\dir1\dir2\dir3

14/04/2003  20:41      <DIR>          .
14/04/2003  20:41      <DIR>          ..
14/04/2003  20:41                  246 RMIserver.class
14/04/2003  20:34                  191 RMIserver.java
14/04/2003  20:41                  893 RMIserverImpl.class
14/04/2003  20:33                  651 RMIserverImpl.java
14/04/2003  20:41                1,778 RMIserverImpl_Skel.class
14/04/2003  20:41                3,342 RMIserverImpl_Stub.class
              6 File(s)          7,101 bytes
              2 Dir(s)  5,941,997,568 bytes free
Avatar billede javaknold Nybegynder
14. april 2003 - 20:44 #13
RETTELSE
error: File d:\dir1\dir2\dir3\RMIserverImpl.class does not contain type
dir1\dir2\dir3\RMIserverImpl as expected, but type dir1.dir2.dir3
.RMIserverImpl. Please remove the file, or make sure it appears in the correct
subdirectory of the class path.
error: Class dir1\dir2\dir3\RMIserverImpl not found.
2 errors
Avatar billede arne_v Ekspert
14. april 2003 - 20:46 #14
Hvis du ikke har nogen package, så virker det i samme directory.

Men det løber du hurtigt sur i når du får mange .java filer.

Fejlen skyldes formentligt at RMIserverImpl.java
indeholder:

package unique2.system.connect;

og så skal filen være:

D:\unique2\system\connect\RMIserverImpl.java

Der er en 1-til-1 sammenhæng mellem pakke-struktur og directory-struktur.
Avatar billede arne_v Ekspert
14. april 2003 - 20:47 #15
Den sidste fejl lyder suspekt.

Kan du ikke lige poste toppen af den fil ?
Avatar billede javaknold Nybegynder
14. april 2003 - 20:52 #16
Er vi enige om at denne burde virke ?
D:\>rmic -v1.2 -classpath d:\unique2\system\connect\RMIserverImpl

Men den giver følgende:
Usage: rmic <options> <class names>

where <options> includes:
  -keep          Do not delete intermediate generated source files
  -keepgenerated (same as "-keep")
.......................
........
Avatar billede arne_v Ekspert
14. april 2003 - 20:53 #17
Slet ikke.

D:\unique2\system\connect\RMIserverImp.java

package unique2.system.connect;

D:\>rmic -v1.2 -classpath d:\ unique2.system.connect.RMIserverImpl

bør virke !
Avatar billede arne_v Ekspert
14. april 2003 - 20:54 #18
og der er et mellemrum efter d:\ !
Avatar billede arne_v Ekspert
14. april 2003 - 20:55 #19
classpath skal pege på roden af pakke-træet

package skal angives med .

classname skal angives med .

filnavne og classpath bruger \
Avatar billede javaknold Nybegynder
14. april 2003 - 21:00 #20
JEG ER MÅLLØS !!

Jeg har prøvet tusinder af kombinationer, men den der - troede backslash havde
samme effekt som punktum i den situation !!

Har du tid at kaste en ultra kort forklaring på hvorfor ?

Under alle omstændigheder - TAK FOR HJÆLPEN !!
Avatar billede javaknold Nybegynder
14. april 2003 - 21:01 #21
Takker !!!!!!!!!!!!!!!!!!!!!
Avatar billede arne_v Ekspert
14. april 2003 - 21:05 #22
Logikken er meget den at når java skal finde en klasse, så leder den
efter:

classpath + "\" + pakkenavn.replace(".","\") + "\" + klassenavn + ".class"

(hvis du forstår den måde at udtrykke det på)
Avatar billede arne_v Ekspert
14. april 2003 - 21:06 #23
Men fordi pakkenavn klistes på classpath skal classpath selvfølgelig
pege på roden af pakke-træet.

Java bruger konsekvent . internet og derfor skal package i .java-filerne
og class argumenter til rmic angives med punktum.
Avatar billede arne_v Ekspert
14. april 2003 - 21:07 #24
Og du er ikke den første somm har bandet lidt over pakke navne
og directory struktur og hvordan man skal angive det.

Men når man engang har lært det, så plejer man at kunne huske det.
Avatar billede javaknold Nybegynder
14. april 2003 - 21:10 #25
Jeg rendte lige ind i et nyt problem - har du tid ?
Tilsyneladende kan den ikke finde Stub-filen

D:\unique2>java -classpath d:\ unique2.system.connect.RMIserverImpl 1399 localhost minServer
RemoteException occurred in server thread; nested exception is:
        java.rmi.UnmarshalException: error unmarshalling arguments; nested excep
tion is:
        java.lang.ClassNotFoundException: unique2.system.connect.RMIserverImpl_S
tub
java.rmi.ServerException: RemoteException occurred in server thread; nested exce
ption is:
        java.rmi.UnmarshalException: error unmarshalling arguments; nested excep
tion is:
        java.lang.ClassNotFoundException: unique2.system.connect.RMIserverImpl_S
tub
        at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:352
)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:207)
        at sun.rmi.transport.Transport$1.run(Transport.java:148)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Transport.java:144)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:4
60)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport
.java:701)
        at java.lang.Thread.run(Thread.java:536)
        at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Stream
RemoteCall.java:247)
        at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:
223)
        at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:350)
        at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
        at java.rmi.Naming.rebind(Naming.java:159)
        at unique2.system.connect.RMIserverImpl.main(RMIserverImpl.java:88)
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested ex
ception is:
        java.lang.ClassNotFoundException: unique2.system.connect.RMIserverImpl_S
tub
        at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
        at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:342
)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:207)
        at sun.rmi.transport.Transport$1.run(Transport.java:148)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Transport.java:144)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:4
60)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport
.java:701)
        at java.lang.Thread.run(Thread.java:536)
Caused by: java.lang.ClassNotFoundException: unique2.system.connect.RMIserverImp
l_Stub
        at java.net.URLClassLoader$1.run(URLClassLoader.java:198)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:186)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:262)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:322)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:207)
        at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:427)
        at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:161)
        at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:629)
        at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:257)
        at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.jav
a:200)
        at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:150
3)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1425)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1
616)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1264)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:322)
        ... 9 more
Avatar billede arne_v Ekspert
14. april 2003 - 21:15 #26
Mit gæt er at du mangler at sætte classpath for RMIRegistry.

Prøv med:

SET CLASSPATH=D:\
RMIRegistry

når du starter den.
Avatar billede javaknold Nybegynder
14. april 2003 - 21:16 #27
Den her jeg vist selv løst, startede fra en bat-fil, der lige skulle korrigeres
og så skal der åbenbart og rodes med noget MySQL kan jeg se.

Det er åbenbart ikke omkostningsfrit at medtage packages i sine java-filer.
Så jeg vender nok snart tilbage med et nyt spørgsmål.

Men tak for hjælpen indtil videre
Avatar billede arne_v Ekspert
14. april 2003 - 21:19 #28
Pakker er lige noget man skal lære.

Men når man har lært det bliver man altså glad for dem, fordi
de strukturer ens klasser.
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