RMI服务器的jar在Red Hat上运行良好,但在Windows上不起作用



我有一个使用Maven和Onejar-Maven-Plugin构建的RMI服务器,此服务器在Eclipse STS上也可以运行良好,而Red Hat上的Jar上也可以运行,但是如果我尝试在Jar上运行jar on我在Windows上的CMD,服务器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.InterfazrmicateGoriaimpl.startrmiserver(Interfazrmicategoriaimpl.java:65), modeloconfigurador.cache.manager.rmi.Interfazrmicategoriaimpl.setpuertormi(Interfazrmicategoriaimpl.java:92), modeloconfigurador.cache.manager.impl.serviciocacheimpl.inicializa(serviciocacheimpl.java:168), serviciocache.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.totectiondomain $ 1. dointersectionprivilege(未知 来源),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 Java JDK上的java.policy没有权限,但确实有。

我在e上运行罐子:然后我打开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.policy文件表格java_home:

// 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上运行罐子时,Windows的Ide Eclipse STS中运行良好,当我在红色帽子上运行同一罐子时也可以运行不错(修改文件Java.policy。)。

这是java.policy文件表格java_home

但是您没有使用Java_home的Java.polcy文件。您正在使用当前目录中的任何一个。

使用-Djava.security.debug=access,failure运行您的应用程序,您将确切地看到正在宣布哪些权限并授予哪些权限,以及哪些策略文件有效。明显不是您的帖子中的一个。

相关内容

最新更新