Spring RMI错误java.lang.ClassNotFoundException:org.springframework.remoting.rmi.RmiInvocationHandler

时间:2012-05-23 13:33:13

标签: java spring java-ee classloader rmi

我正在尝试使用Spring创建一些bean并将它们导出到RMI ...

这是我的代码:

<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
    <property name="serviceName" value="OfferService" />
    <property name="service" ref="offerService" />
    <property name="serviceInterface" value="ro.project.services.OfferService" />
    <property name="registryPort" value="1199" />
</bean>

我在我的根文件夹中创建了一个名为“policy.all”的文件,我正在使用这些参数运行我的VM,但我仍然有这个错误:

java.lang.ClassNotFoundException: org.springframework.remoting.rmi.RmiInvocationHandler (no security manager: RMI class loader disabled)

我不知道该怎么做...在linux中,完全相同的项目运行正常(使用jdk 1.7.0.4)但在Windows中没有...在java 1.5(windows)中它正在工作..但在java 1.7.0.4(windows)它不能正常工作......

编辑:

我的错误是:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.remoting.rmi.RmiServiceExporter#0' defined in class path resource [spring/services.xml]: Invocation of init method failed; nested exception is java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
java.lang.ClassNotFoundException: org.springframework.remoting.rmi.RmiInvocationHandler (no security manager: RMI class loader disabled)

添加以下行后:

if (System.getSecurityManager() == null)
{ 
    RMISecurityManager manager = new RMISecurityManager();
    System.setSecurityManager(manager); 
}

我有这个错误:

Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [spring/application-context.xml]; nested exception is java.io.FileNotFoundException: class path resource [spring/application-context.xml] cannot be opened because it does not exist

提前谢谢

4 个答案:

答案 0 :(得分:2)

这里的重点不是安装安全管理器而是查找类。您缺少部署中的某些JAR文件。

答案 1 :(得分:2)

我认为它仍然不重要,但我个人今天面对同样的问题,并且找不到答案。我在这里发布,也许它可以帮助别人。

解决方案:停止rmiregistry程序,或使用-J选项将Spring jar传递给rmiregistry。最简单的方法就是停止rmiregistry并允许Spring以所有必需的类启动另一个。并且不要设置RMISecurityManager

答案 2 :(得分:0)

您需要在代码的一部分中使用此功能:

System.setSecurityManager(new RMISecurityManager());

您也可以拥有其他安全管理器,但只需安装安全管理器即可。

实际上,我发布的专线可以很容易地在独立桌面应用程序的主类中触发,但我不确定你的情况。你应该寻找一个可能的配置选项。

答案 3 :(得分:0)

使用Spring RMIServiceExporter,正确管理RMI Registry的最佳实践是使用RMIRegistryFactoryBean。为了更好地理解,我使用RemoteBean粘贴了一个Spring配置示例:

<bean id="RemoteServices" class="remote.RMIServicesImpl"/>
<bean id="RemoteRmiRegistry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean">
        <property name="alwaysCreate" value="true" />
        <property name="port" value="1093"></property>
</bean>
<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
        <property name="service" ref="RemoteServices" />
        <property name="serviceInterface" value="remote.RemoteInterface" />
        <property name="serviceName" value="RemoteServices" />
        <property name="replaceExistingBinding" value="true"></property>
        <property name="registry" ref="RemoteRmiRegistry"></property>
    </bean>

通过这种方式,RmiRegistryFactoryBean将自动管理有关RMI套接字层的所有内容,并且您不需要停止JVM,只需重新部署它。

如果有效,请评价我。