2011-11-25 16 views
11

Estoy tratando de prohibir la llamada a System.exit(int); en algunos frascos.prohíbe la llamada a System.exit

Estas jarras serán desarrolladas por equipos externos y cargadas por nuestra aplicación "contenedor".

Mi primer reflejo es utilizar el gestor de seguridad Java:

-Djava.security.manager-Djava.security.debug=all 

con el archivo más simple ${user.home}/.java.policy:

grant {}; 

Aunque ya no puedo llamar como System.getProperties() (desde No tengo java.util.PropertyPermission), puedo hacer un System.exit (0) !!

La opción java.security.debug=all da la siguiente consola:

scl: getPerms ProtectionDomain (file: my-bin-path <no sign certificates>) 
sun.misc.Launcher $ AppClassLoader @ 10385c1 
<no principals> 
java.security.Permissions @ 15b7986 (
(java.lang.RuntimePermission exitVM) 
(java.io.FilePermission \my-bin-path\- read) 
) 

¿Por qué todas las clases en mi-bin-ruta java.lang.RuntimePermission exitVM han otorgado ?????

gracias

+0

Aparentemente, 'java.lang.RuntimePermission exitVM' se concede de forma predeterminada, quizás tenga que denegarlo explícitamente. – Romain

+0

Espero que el permiso exitVM esté activado de manera predeterminada. Si una parte del código Java llega al final de su ejecución, entonces quizás necesite llamar implícitamente a System.exit (0) para informarle a la VM que está listo. – Chris

+0

Asumo que si quieres saber cómo apagarlo, recomendaría editar la pregunta para preguntar específicamente eso. – Chris

Respuesta

2

Desde el Javadoc de RuntimePermission:

Nota: "exitVM *" El permiso se concede automáticamente a todo el código cargado desde la ruta de clase de aplicaciones, lo que permite que las aplicaciones de interrumpir a sí mismos.

Al leer esto, parece que tiene que denegar explícitamente este permiso escribiendo su propio SecurityManager. (Para ver un ejemplo, vea esta respuesta: Prevent System.exit to actually exit the JVM)

+0

¡Gracias, lo encuentras! – kiki

1

O bien, puede hacer AOP e interceptar System.exit. Hacerlo usted mismo sería: cree su propio cargador de clases y use BPEL para rastrear System.exit y parchee esas llamadas. Realmente no es un gran esfuerzo.

3

Según el informe de error, http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4286238, el archivo de política no estaba deshabilitando las llamadas a System.exit(). Estoy ejecutando una aplicación con Java 1.6 y sigo viendo este error a pesar de que está "resuelto". Al igual que en el OP, tengo un archivo de política de todo el sistema que no incluye un permiso para exitVM. Sin embargo, puedo salir de la aplicación sin lanzar ninguna excepción.

Mi comprensión de incluir un archivo de política personalizado es que todos los permisos están en la lista negra, excepto los incluidos en el archivo de política. Como exitVM no está incluido, no se debe permitir (anulando el permiso predeterminado mencionado por MicSim). Pero este no es el caso.

Cuestiones relacionadas