RMI服务器´;s罐在红帽上运行良好,但不´;我不能在windows上工作

RMI服务器´;s罐在红帽上运行良好,但不´;我不能在windows上工作,windows,maven,jar,rmi,Windows,Maven,Jar,Rmi,我有一个使用Maven和onejar Maven插件构建的RMI服务器,该服务器在eclipse STS上运行良好,在Red Hat上运行jar也很好,但是如果我尝试在windows上的cmd上运行jar,服务器RMI会抛出下一个异常: java.security.AccessControlContext.checkPermission(未知源), java.security.AccessController.checkPermission(未知源), java.lang.SecurityMan

我有一个使用Maven和onejar Maven插件构建的RMI服务器,该服务器在eclipse STS上运行良好,在Red Hat上运行jar也很好,但是如果我尝试在windows上的cmd上运行jar,服务器RMI会抛出下一个异常:

java.security.AccessControlContext.checkPermission(未知源), java.security.AccessController.checkPermission(未知源), java.lang.SecurityManager.checkPermission(未知源), java.lang.Thread.setContextClassLoader(未知源), com.simontuffs.onejar.JarClassLoader.loadClass(JarClassLoader.java:629), java.lang.ClassLoader.loadClass(未知源), modeloconfigurador.cache.manager.rmi.interfazrimcategoriaaimpl.startRMIServer(interfazrimcategoriaaimpl.java:65), modeloconfigurador.cache.manager.rmi.interfazrimcategoriaimpl.setpuertromi(interfazrimcategoriaimpl.java:92), modeloconfigurador.cache.manager.impl.ServicioCacheImpl.inicializa(ServicioCacheImpl.java:168), servicicocache.CachePrincipal$1.run(CachePrincipal.java:79), java.awt.event.InvocationEvent.dispatch(未知源), java.awt.EventQueue.dispatchEventImpl(未知源), java.awt.EventQueue.access$500(未知源), java.awt.EventQueue$3.run(未知源), java.awt.EventQueue$3.run(未知源), java.security.AccessController.doPrivileged(本机方法), java.security.ProtectionDomain$1.doIntersectionPrivilege(未知 Source),java.awt.EventQueue.dispatchEvent(未知源), java.awt.EventDispatchThread.pumpOneEventForFilters(未知源), java.awt.EventDispatchThread.pumpEventsForFilter(未知源), java.awt.EventDispatchThread.pumpEventsForHierarchy(未知源), java.awt.EventDispatchThread.pumpEvents(未知源), java.awt.EventDispatchThread.pumpEvents(未知源), java.awt.EventDispatchThread.run(未知源)]

java JDK上的java.policy似乎没有权限,但它确实有

我在E:上运行jar,然后像管理员一样打开cmd

这是我的代码:

RMI服务器:

private void startRMIServer() {
    try{

        log.trace("Consultando privilegios java.security.policy");
        System.setProperty("java.security.policy","java.policy");

        System.setSecurityManager(new SecurityManager());

        log.trace(new StringBuilder("Creando Registrry en el puerto ").append(puertoRMI));
        _registry = LocateRegistry.createRegistry(puertoRMI);

        _interfazRMICategoriaMC=(InterfazRMICategoria)UnicastRemoteObject.exportObject(this,puertoRMI);
        String nombreObjR="ObtenerCategorias";

        _registry.bind(nombreObjR, _interfazRMICategoriaMC);
        log.info(new StringBuilder("(RMI) Objeto Remoto colocado en Registry con el nombre ").append(nombreObjR));

    }catch(Exception e){

        log.error(new StringBuilder("podible error por permisos del security manager: ").append(Arrays.toString(e.getStackTrace())));

    }
}
这是java_主页中的java.policy文件:

// Standard extensions get all permissions by default

grant codeBase "file:${{java.ext.dirs}}/*" {
        permission java.security.AllPermission;
};

// default permissions granted to all domains

grant {
        // Allows any thread to stop itself using the java.lang.Thread.stop()
        // method that takes no argument.
        // Note that this permission is granted by default only to remain
        // backwards compatible.
        // It is strongly recommended that you either remove this permission
        // from this policy file or further restrict it to code sources
        // that you specify, because Thread.stop() is potentially unsafe.
        // See the API specification of java.lang.Thread.stop() for more
        // information.
        permission java.lang.RuntimePermission "stopThread";

        // allows anyone to listen on dynamic ports
        permission java.net.SocketPermission "localhost:0", "listen";

        // permission for standard RMI registry port
        permission java.net.SocketPermission "localhost:1099", "listen";

        // "standard" properies that can be read by anyone

        permission java.util.PropertyPermission "java.version", "read";
        permission java.util.PropertyPermission "java.vendor", "read";
        permission java.util.PropertyPermission "java.vendor.url", "read";
        permission java.util.PropertyPermission "java.class.version", "read";
        permission java.util.PropertyPermission "os.name", "read";
        permission java.util.PropertyPermission "os.version", "read";
        permission java.util.PropertyPermission "os.arch", "read";
        permission java.util.PropertyPermission "file.separator", "read";
        permission java.util.PropertyPermission "path.separator", "read";
        permission java.util.PropertyPermission "line.separator", "read";

        permission java.util.PropertyPermission "java.specification.version", "read";
        permission java.util.PropertyPermission "java.specification.vendor", "read";
        permission java.util.PropertyPermission "java.specification.name", "read";

        permission java.util.PropertyPermission "java.vm.specification.version", "read";
        permission java.util.PropertyPermission "java.vm.specification.vendor", "read";
        permission java.util.PropertyPermission "java.vm.specification.name", "read";
        permission java.util.PropertyPermission "java.vm.version", "read";
        permission java.util.PropertyPermission "java.vm.vendor", "read";
        permission java.util.PropertyPermission "java.vm.name", "read";
        permission java.security.AllPermission;
};
该项目有自己的java.policy文件,但对于eclise是不可见的

问题在于,当我尝试仅在windos上运行JAR时,在IDE中,eclipse STS在windows上运行良好,当我在Red Hat上运行相同的JAR时也运行良好(修改使用中JDK中的java.policy文件)

这是java_主页中的java.policy文件

但是您没有使用java_HOME中的java.polcy文件。您正在使用当前目录中的任何目录(如果有)


使用
-Djava.security.debug=access,failure
运行您的应用程序,您将确切地看到哪些权限被授予,哪些策略文件(如果有的话)有效显然这不是你文章中的内容。

事实上你是对的,当我使用netbeans IDE运行maven项目时,项目使用当前目录中的java.policy,但当我在eclipse STS上使用相同的项目时,使用的java策略来自JDK,无论如何,项目有自己的java.policy文件,但是对于eclise来说是不可见的,问题是当我尝试只在windos上运行JAR时,在IDE中,eclipse STS在windows上运行良好,当我在Red Hat上运行相同的JAR时也运行良好(修改使用中的JDK中的java.policy文件)。我不会浪费时间去理解那些未经资本化的未经处理的混乱,但问题正如我所描述的。它在Eclipse下如何运行真的不感兴趣。问题是它如何独立运行。