【问题标题】:java.lang.ClassNotFoundException in RMI,no security manager RMI class loader disabledRMI 中的 java.lang.ClassNotFoundException,没有禁用安全管理器 RMI 类加载器
【发布时间】:2012-06-21 03:26:59
【问题描述】:

我已经创建了下面的 bat 文件来运行我的 RMI 服务器

@echo Off

set classpath=C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\RMI_Server\bin\;
set classpath=C:\policy.all;
set classpath=C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\RMI_Server\log4j-1.2.12.jar;
set classpath=C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\RMI_Server\log4j-1.2.15.jar;
set classpath=C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\RMI_Server\log4j.jar;
set classpath=C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\RMI_Server\log4jProperties.jar;
set classpath=C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\RMI_Server\bcprov-jdk15-144.jar\bcprov-jdk15-144.jar;
set classpath=C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\RMI_Server\sevenzipjbinding.zip;
set classpath=C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\RMI_Server\sevenzipjbinding-AllPlatforms.zip;
set classpath=C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\RMI_Server\apache-log4j-1.2.17\log4j-1.2.17.jar;




set classpath=%classpath%;.

java -Djava.security.manager -Djava.security.policy=C:\policy.all

java -Xms512m -Xmx1024m ExecutorServer -Djava.rmi.server.codebase=file:C:/Program Files/Apache Software Foundation/Tomcat 6.0/webapps/RMI_Server/bin/ -Djava.security.policy=C:\policy.all

pause

我能够运行我的 RMI 服务器 但是当 RMI 尝试连接到 RMI 服务器时,我得到以下异常

Execption in RMI...java.rmi.UnmarshalException: error unmarshalling return; nest
ed exception is:
        java.lang.ClassNotFoundException: ExecutorInterface (no security manager
: RMI class loader disabled)
java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
        java.lang.ClassNotFoundException: ExecutorInterface (no security manager
: RMI class loader disabled)
        at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
        at java.rmi.Naming.lookup(Unknown Source)
        at com.mindcraft.queryExecutor.actionclass.acInsertExecutorDetails.rmiCl
ientCall(acInsertExecutorDetails.java:272)
        at com.mindcraft.queryExecutor.actionclass.acInsertExecutorDetails.execu
te(acInsertExecutorDetails.java:218)

我在运行时提供了策略文件和代码库。我没有得到我在这里缺少的东西。 如何在rmiregistry的路径中添加lcas?

【问题讨论】:

  • 您可能想通过打印System.getSecurityManager()(并获取"setSecurityManager" 的代码)来检查安全管理器是否被破坏。我还建议使用 IIRC "java.rmi.server.codebase" 禁用移动代码加载(在“Java 编程语言的安全编码指南,版本 4.0”oracle.com/technetwork/java/seccodeguide-139067.html#3-8 中是错误的)。分配最低合理权限也是一个好主意。

标签: java rmi distributed-computing


【解决方案1】:
  1. 将 CLASSPATH 设置为 10 个连续值不起作用。它只取最后一个值。你需要设置它=%classpath%;。您还需要引用所有名称中带有空格的目录。
  2. 将 policy.all 放在 CLASSPATH 上毫无意义。
  3. java.lang.ClassNotFoundException: ExecutorInterface 确切地说出了什么问题。该类不存在于客户端。

【讨论】:

  • ExecutorInterface 存在于客户端应用程序中。我猜 ExecutorInterface 不在服务器端的 rmiregistry 路径中。
  • @happy 如果这是您在绑定时遇到的问题,而不是在查找时遇到的问题。您是否可能在不同的包中有两个不同版本的 ExecutorInterface。
  • ExecutorInterface 在客户端和服务器的不同包中。创建相同的包解决了我的问题。谢谢 EJP
【解决方案2】:

简单的解决方案是在您的客户端项目类路径中添加 ExecutorInterface.class 或其相关 jar。

【讨论】:

    猜你喜欢
    • 2023-04-09
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    相关资源
    最近更新 更多