Pregunta

que quería añadir a mi archivo jdk6\jre\lib\security\java.policy una prohibición de crear algunas clases que están en la lista negra por appengine. Por ejemplo, yo quiero que mi JVM local para lanzar una excepción cuando la aplicación intenta crear una instancia de javax.naming.NamingException.

Es posible?

Voy a tratar de explicar mi problema específico aquí. Google ofrece un servicio (motor de aplicación GAE-Google) que tiene algunas limitaciones en lo que se pueden utilizar clases. Por ejemplo no crear instancias de clases JNDI que se encuentran en el paquete javax.naming. También ofrecen un servidor de prueba que se puede utilizar para las pruebas de esta aplicación en mi máquina, pero este servidor permite a dichas clases y pueden exacute el código. Se entera de que ha utilizado una clase en la lista negra sólo después de que cargue la aplicación en google. Estaba pensando si tal clase de aplicación de la lista negra no se podía hacer en la JVM desarrollo. Cosa que estoy pensando que esto sería fácil ya que podrían proporcionar un archivo de este tipo de políticas.

¿Fue útil?

Solución

Se puede escribir un pequeño cargador de aplicaciones que crea una nueva , cargador de clases personalizadas. Clases de la aplicación podrían entonces ser cargados usando este cargador de clases.

En el cargador de clase personalizada, a continuación, puede tirar ClassNotFoundException cuando la aplicación intenta acceder a una clase que desea a la lista negra.

Usted tendrá que sobrecargar el método load (). Este método será el encargado de lanzar la excepción de sus clases en la lista negra ordelegating al cargador de clases padre si se permite que la clase. Una implementación de ejemplo:

public Class loadClass(String name) throws ClassNotFoundException {
    if(name.equals("javax.lang.ClassIDontLike")){
       throw new ClassNotFoundException("I'm sorry, Dave. I'm afraid I can't do that.");
    }
    return super.loadClass(name, false);
}

(Por supuesto, una implementación real puede ser mucho más sofisticado que esto)

Debido a que las clases de la aplicación se cargan a través de este cargador de clases, y que sólo están delegando la invokations al cargador de clases padre loadClass () cuando se quiere, se puede lista negra cualquier clase que se necesita.

Estoy bastante seguro de que este es el método que utiliza Google a la lista negra clases en su servidor. Ellos cargan todas las aplicaciones en un cargador de clases específicas. Esto también es similar a la forma en que Tomcat aísla las diferentes aplicaciones web.

Otros consejos

No preferirías obtener errores de compilación que los errores de ejecución, mientras que las pruebas de su programa? Se podría configurar el IDE o compilador para que le avise cuando se crea una instancia de una clase no deseado. Sé AspectJ tiene algunas características agradables para esto: Se pueden definir las advertencias de compilación / errores en puntos de unión y obtener retroalimentación en, por ejemplo Eclipse. Para utilizar esta en Eclipse, sólo tiene que instalar el plugin AspectJ y escribir un aspecto adecuado. Para obtener los errores durante la compilación de una línea de comandos o script, usted realmente tiene que utilizar el compilador AspectJ, pero dudo que lo que se necesita eso.

La documentación de Java recoge todos los posibles permisos de política aquí: http://java.sun.com/javase/ 6 / docs / notas técnicas / guías / security / permissions.html

Clase creación / carga no se menciona, por lo que creo que no se puede hacer cumplir esta utilizando una política.

En cualquier caso, ¿por qué quiere lanzar una excepción cuando se carga una clase de excepción? Tal vez usted podría explicar su problema, entonces alguien podría ser capaz de proponer una solución.

Editar

Una forma de evitar la carga de ciertas clases sería sacarlos de la instalación de JRE. La mayoría de las clases del sistema están contenidas en rt.jar en la instalación de JDK / JRE. Usted debe ser capaz de modificarlo con cualquier postal-herramienta.

Hay que crear una instalación especial de JRE y, a modificar su rt.jar. Ese es un truco feo, pero debería estar bien para propósitos de prueba ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top