Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Tomcat 7中运行RMI客户端时得到ClassNotFoundException_Java_Tomcat_Permissions_Rmi_Distributed Computing - Fatal编程技术网

Java 在Tomcat 7中运行RMI客户端时得到ClassNotFoundException

Java 在Tomcat 7中运行RMI客户端时得到ClassNotFoundException,java,tomcat,permissions,rmi,distributed-computing,Java,Tomcat,Permissions,Rmi,Distributed Computing,我在RMI和Tomcat方面遇到了一些困难。这就是我正在处理的这个项目的主要方面:RMI客户机由运行在Tomcat中的Javaservlet调用,servlet接受用户输入并将参数传递给RMI客户机。然后RMI客户端调用RMI服务器来运行繁重的计算部分。问题是,尽管没有在Tomcat服务器中托管RMI客户机,一切都可以正常工作,但一旦我将其放入Tomcat中,它就不会运行。 以下是一些配置: 我没有在代码中设置安全管理器,我假设Tomcat将使用自己的 //if (System.getS

我在RMI和Tomcat方面遇到了一些困难。这就是我正在处理的这个项目的主要方面:RMI客户机由运行在Tomcat中的Javaservlet调用,servlet接受用户输入并将参数传递给RMI客户机。然后RMI客户端调用RMI服务器来运行繁重的计算部分。问题是,尽管没有在Tomcat服务器中托管RMI客户机,一切都可以正常工作,但一旦我将其放入Tomcat中,它就不会运行。 以下是一些配置: 我没有在代码中设置安全管理器,我假设Tomcat将使用自己的

    //if (System.getSecurityManager() == null) {
    //    System.setSecurityManager(new SecurityManager());
    //}
我还设置了以下权限:

$CATALINA_HOME/conf/CATALINA.policy

除了这两种配置之外,我没有设置任何java.rmi.server.codebase或java.security.policy

通过将代码从RMI客户端提交到RMI服务器,我收到了以下错误:

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
java.lang.ClassNotFoundException: mypackage.SomeClass
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 java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:178)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132)
at com.sun.proxy.$Proxy19.executeTask(Unknown Source)
at cluster.server.centralservice.CentralManagementServer.submitJob(CentralManagementServer.java:232)
at cluster.server.centralservice.JobSubmitter.runJob(JobSubmitter.java:226)
at cluster.server.centralservice.JobSubmitter.doPost(JobSubmitter.java:144)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
java.lang.ClassNotFoundException: mypackage.SomeClass
我被困在这里好几天了。我在网上搜索的大多数示例都已经过时,并且没有使用Tomcat设置涵盖RMI。 有人能帮忙吗?非常感谢。

如例外所述

java.lang.ClassNotFoundException: mypackage.SomeClass
发生这种情况是因为RMI使用的是一个单独的类加载器,它无法查看
SomeClass

添加到tomcat/conf目录中的context.xml文件(到context元素)


此更改修复了我面临的类似问题(不特别是RMI),但值得一试。

非常感谢。我只是试了一下。我也得到了同样的结果。下面是context.xml WEB-INF/WEB.xml我应该在代码中设置一个代码库吗?RMI服务器是否与Tomcat运行在同一个JVM中?感谢您的关注@EJP我假设RMI服务器指的是启动rmiregistry命令的机器。如果是这种情况,那么RMI服务器将在远程计算机中运行。我在Tomcat中运行的RMI是RMI客户机,它调用RMI服务器在RMI服务器上运行大量计算。RMI客户端打包在jar中,并由Tomcat中的servlet调用。因此,mypackage.SomeClass没有部署到导出远程对象的JVM的类路径中的服务器主机上。我认为这正是问题所在。但是我不知道如何通过Tomcat设置“java.rmi.server.codebase”。如果我不通过Tomcat运行这个jar,我就可以使用System.setProperty(“java.rmi.server.codebase”)而且一切都运行良好。但一旦进入Tomcat内部,Tomcat似乎有自己的处理方式。有什么建议吗?您不必使用代码库功能。如果您可以静态地将该类部署到服务器JVM,请这样做。否则,您必须在客户端expor之前在Tomcat中找到如何设置该系统属性的方法任何远程对象。
java.lang.ClassNotFoundException: mypackage.SomeClass