嗨,我试图运行结合一个类来命名服务器的Java应用程序,但我不断地得到一个ClassNotFoundException
首先,我启动注册表:
rmiregistry的
然后从eclipse我尝试执行服务器,但得到此错误
java.rmi.ServerException:服务器线程中发生RemoteException; 嵌套异常是:java.rmi.UnmarshalException:错误解组参数; 嵌套异常是:java.lang.ClassNotFoundException:sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:396)的sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250)中的progInternet2008.commons.NominabileFactory at sun.rmi.transport.Transport $ 1.run(Transport.java:159)位于sun.rmi的sun.rmi.transport.Transport.serviceCall(Transport.java:155)的java.security.AccessController.doPrivileged(Native Method) .transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)at sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run0(TCPTransport.java:790)at sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.运行(TCPTransport.java:649)java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:886)java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:908)at java.lang .hread.run(Thread.java:619)位于sun.rmi的sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233). server.UnicastRef.invoke(UnicastRef.java:359)位于sun.rmi.registry.RegistryImpl_Stub.rebind(未知来源)的progInternet2008.Pozzobon.tesi.Slave.main(Slave.java:54)引起:java.rmi. UnmarshalException:错误解组参数; 嵌套异常是:java.lang.ClassNotFoundException:sun.rmi.registry.RegistryImpl_Skel中的progInternet2008.commons.NominabileFactory.
我已经阅读了RMI Java教程,但仍然无法使其工作......
作为VM Arguments,我设置了这个:
-Djava.rmi.server.codebase =文件:$ {} workspace_loc/progInternet2008
请帮我
(我正在使用Java 6)
我正在尝试制作Java RMI客户端/服务器应用程序.我在启动应用程序的服务器端时遇到问题,因为当我尝试启动应用程序的服务器端时,它在调用Registry.bind()方法期间一直运行到ClassNotFoundException.
我从这里开始使用简单的教程:http://docs.oracle.com/javase/1.5.0/docs/guide/rmi/hello/hello-world.html.按照这些说明操作后,它最初抛出一个ClassNotFoundException,抱怨它无法找到"example.hello.Hello".我能够通过从教程中的destDir目录启动rmiregistry来解决这个问题,因为rmiregistry显然使用其初始起始目录作为其类路径的一部分.
之后我开始使用我的其他测试应用程序,直到我开始在服务器类中使用第三方jar文件时我才感觉良好.现在,如果我的服务器类引用任何jar文件中的任何内容,则Registry.bind()会抛出ClassNotFoundException,因为rmiregistry应用程序不知道这些jar文件.
据我所知,rmiregistry不接受任何类型的路径启动arg,所以我想知道如何告诉它我想要它承认什么类路径.根据这里的教程:http://docs.oracle.com/javase/tutorial/rmi/running.html,"你必须确保你将运行rmiregistry的shell或窗口没有设置CLASSPATH环境变量或有一个CLASSPATH环境变量,它不包含你想要下载到远程对象客户端的任何类的路径." 这听起来与我需要的相反......或者我读错了吗?有没有人有任何成功启动使用第三方jar的RMI客户端/服务器(在我的情况下,commons-io,commons-logging和rmiio)?
这是在Windows上,顺便说一下.
更新
我找到了解决方法.请参阅下面的答案.
对于服务器端的RMI,我们需要启动rmiregistry程序,还是只需要调用LocateRegistry.createRegistry?如果两者都有可能,有哪些优点和缺点?
Registry班级和Naming班级有什么区别.
在我的申请中,我正在Registry上课.但我想了解Naming课程及其用途?
我正在研究Java RMI.我在端口2028上运行我的rmiregistry没有什么问题,因为我已经使用那个来运行我的测试程序.我可以使用其他端口运行我的程序,但我想知道,我们如何关闭在特定端口上运行的rmiregistry?
我正在运行java RMI的Hello World示例
1)我在一个空文件夹中运行注册表
motta@motta-laptop ~/tmp $ rmiregistry
Run Code Online (Sandbox Code Playgroud)
2)我启动HTTP服务器以在运行时检索类.download文件夹包含客户端 - 服务器的远程接口
motta@motta-laptop ~/download $ java NanoHTTPD 8080
Run Code Online (Sandbox Code Playgroud)
3)我按照java RMI教程的建议启动服务器传递java.rmi.server.codebase属性
motta@motta-laptop ~/server $ java -Djava.rmi.server.codebase="http://localhost:8080" WarehouseServer
Run Code Online (Sandbox Code Playgroud)
RMI注册表未联系HTTP服务器并且抛出异常(请参阅问题后的详细信息). 但如果我做以下事情
1)使用java.rmi.server.codebase属性启动rmi注册表
motta@motta-laptop ~/tmp $ rmiregistry -J-Djava.rmi.server.codebase="http://localhost:8080/"
Run Code Online (Sandbox Code Playgroud)
2)像以前一样启动HTTP服务器
3)没有任何选项启动服务器
motta@motta-laptop ~/server $ java WarehouseServer
Run Code Online (Sandbox Code Playgroud)
它有效,但为什么呢?似乎在第一个过程中,RMI注册表忽略了java.rmi.server.codebase属性
谢谢
=================================
我在跑步
java version "1.7.0_21"
Java(TM) SE Runtime Environment (build 1.7.0_21-b11)
Java HotSpot(TM) 64-Bit Server VM (build 23.21-b01, mixed mode)
Run Code Online (Sandbox Code Playgroud)
RMI注册表的例外
Constructing server implementation...
Binding server implementation to registry...
Exception in thread "main" java.rmi.ServerException: RemoteException occurred in …Run Code Online (Sandbox Code Playgroud) 我为客户端和服务器编写了java程序.但是,要运行该程序,我需要手动启动rmi注册表!如何通过java代码(通过服务器)启动RMI注册表?
我正在为RMI客户端应用程序编写一组系统集成测试.我想在JUnit 3.8.2中启动RMI服务器,然后运行这些测试.有没有人这样做过?
我在使用main的pojo中使用类似的东西:
import java.rmi.registry.*;
....
//setup
try {
java.rmi.registry.LocateRegistry.createRegistry(1099);
System.out.println("RMI registry ready.");
this.StartMyServer();
// client set up
MyClient m = null;
m = (MyClient) Naming.lookup("//MyHost/MyServer", m);
// tests here
} catch (MyClientException me) {
System.out.println("MyClient fall down go boom");
} catch (MyServerException me) {
System.out.println("MyServer fall down go boom");
} catch (Exception e) {
System.out.println("Exception starting RMI registry:");
}
将此转换为junit测试的最佳方法是什么,因此注册表只启动一次,并且仅在注册表实际启动时才运行测试?我想避免让测试类有一个测试方法,其中包含来自main的所有测试代码,这是我在来到这里之前发现的.
另外,在编写测试时应该注意什么?任何RMI测试都有问题吗?
我有一个可以通过RMI连接的服务对象.目前我这样做:
服务器
Registry r = LocateRegistry.createRegistry(1234);
r.bind("server", UnicastRemoteObject.exportObject(remoteServer, 0));
Run Code Online (Sandbox Code Playgroud)
客户
RemoteServer s = LocateRegistry.getRegistry("example.com", 1234).lookup("server");
Run Code Online (Sandbox Code Playgroud)
服务器上的注册表只有一个用途,用于链接到单个服务器对象.我想我也可以在服务器上这样做:
UnicastRemoteObject.exportObject(remoteServer, 1234);
Run Code Online (Sandbox Code Playgroud)
但那我将如何从客户端连接到服务器对象?
我正在努力获得rmi连接.我遇到了很多安全问题,但一直无法找到解决这一问题的方法.我执行我的jar文件:
java -Djava.security.policy=java.security.AllPermission -jar "myjarfile"
Run Code Online (Sandbox Code Playgroud)
我用来创建它的代码是:
public class server
{
public static void main(String args[])throws Exception
{
if (System.getSecurityManager() == null)
System.setSecurityManager ( new RMISecurityManager() {
public void checkConnect (String host, int port) {}
public void checkConnect (String host, int port, Object context) {}
});
try
{
sampleserverimpl server = new sampleserverimpl();
System.out.println("SERVER IS WAITING");
LocateRegistry.createRegistry(2020);
//Runtime.getRuntime().exec("rmiregistry 2020");
Naming.rebind("//localhost:2020/SERVER", server);
}
catch(Exception e)
{
System.out.println(e);
}
}
};
Run Code Online (Sandbox Code Playgroud)
我收到的错误跟踪是:
Exception in thread "RMI TCP Connection(idle)" java.security.AccessControlExcept
ion: access denied (java.net.SocketPermission …Run Code Online (Sandbox Code Playgroud) 这是完整的例外:
Computeappengine exceptionRemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: Client.prog (no security manager: RMI class loader disabled)
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: Client.prog (no security manager: RMI class loader disabled)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:334)
at sun.rmi.transport.Transport$1.run(Transport.java:159)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:142)
at Engine.ComputeappEngine_Stub.executeTask(Unknown …Run Code Online (Sandbox Code Playgroud) 我想设置两个运行jstatd的服务器,这样我就可以动态监控我的应用程序.Web服务器已经启动并运行,但是另一台服务器总是会遇到这样的例外情况.
无法将/ JStatRemoteHost绑定到RMI注册表java.rmi.ServerException:服务器线程中发生了RemoteException; 嵌套异常是:java.rmi.UnmarshalException:错误解组参数; 嵌套的例外是:抛出java.lang.ClassNotFoundException:sun.jvmstat.monitor.remote.RemoteHost(无安全管理器:RMI类装载器禁用)在sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:419)在sun.rmi .server.UnicastServerRef.dispatch(UnicastServerRef.java:267)at sun.rmi.transport.Transport $ 1.run(Transport.java:177)at sun.rmi.transport.Transport $ 1.run(Transport.java:174)at at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java)中的sun.rmi.transport.Transport.serviceCall(Transport.java:173)中的java.security.AccessController.doPrivileged(Native Method)java:143)引起:java.rmi.UnmarshalException:错误解组参数; 嵌套异常是:java.lang.ClassNotFoundException:sun.rmi.reg中的sun.rmi.registry.RegistryImpl_Skel.dispatch(未知源)sun.jvmstat.monitor.remote.RemoteHost(没有安全管理器:RMI类加载器被禁用).位于sun.rmi的sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267)的sunastServerRef.oldDispatch(UnicastServerRef.java:409)位于sun.rmi的sun.rmi.transport.Transport $ 1.run(Transport.java:177). transport.Transport $ 1.run(Transport.java:174)位于sun.rmi.transport.tcp的sun.rmi.transport.Transport.serviceCall(Transport.java:173)的java.security.AccessController.doPrivileged(Native Method) .TCPTransport.handleMessages(TCPTransport.java:553)at sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.
我确定jstatd加载了内容为的策略文件
grant codebase"file:$ {java.home} /../ lib/tools.jar"{permission java.security.AllPermission; };
我无法想象问题是什么来的,请帮忙.