2012-05-22 11 views
6

Hemos utilizado liquibase en nuestra compañía por un tiempo, y hemos tenido un entorno de integración continua configurado para las migraciones de bases de datos que romperían un trabajo cuando un parche tuviera un error.¿Es posible agregar metadatos personalizados a los archivos .class?

Una "característica" interesante de ese entorno de CI es que la rotura tenía un "posible culpable", porque todos los parches deben tener un "autor", y el mensaje de error muestra el nombre del autor.

Si no sabes lo que es la liquiba, está bien, no es el punto.

El punto es: tener una persona nombre atribuido a un error es muy bueno para el desarrollo de software proccess: problemas se abordan de forma más rápida.

Así que estaba pensando: ¿Es eso posible para stacktraces de Java?

¿Podríamos tener una stacktrace con nombres de personas junto con números de línea como el siguiente?

java.lang.NullPointerException 
at org.hibernate.tuple.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:372:john) 
at org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:3121:mike) 
at org.hibernate.event.def.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:232:bob) 
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:173:bob) 
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87:bob) 
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862:john) 

Ese tipo de información tendría que ser sacado de un sistema de SCM (como la realización de la "culpa SVN" para cada archivo de origen).

Ahora, olvídate de destrozar el tiempo de compilación por un minuto: ¿Eso sería posible? Para agregar metadatos a archivos de clase como ese?

+0

¿Por qué pondría esto en un archivo de clase? Tener esto en un sistema externo probablemente sería una mejor idea? – Suman

+0

Dudo que los rastros sean relevantes, las líneas que lanzan una NullPointerException raramente son la línea responsable del error (y el autor ciertamente no es el culpable). El error ocurre porque los datos procesados ​​por el código no se desinfectaron correctamente, y cuando explota es demasiado tarde (y demasiado lejos del punto en el código que se debe corregir). –

Respuesta

1

Normalmente, esta característica se puede implementar en la parte superior del sistema de control de versiones.Necesita saber la revisión de su archivo en su sistema de control de versiones, luego puede llamar al comando blame/annotate para obtener información sobre quién ha cambiado cada línea individual. No necesita almacenar esta información en el archivo de clase, siempre que pueda identificar la revisión de cada clase que implementa (por ejemplo, solo implementa determinada etiqueta o etiqueta).

Si no desea acceder al control de versión cuando investiga el seguimiento de pila, puede almacenar información de anotación de línea en el archivo de clase, p. usar el postprocesador de clase durante su compilación que puede agregar una anotación personalizada en el nivel de clase (esto es relativamente trivial para implementar usando ASM). A continuación, el registrador que imprime el seguimiento de la pila podría leer esta anotación en el tiempo de ejecución, de manera similar al showing jar versions.

+0

Gran respuesta Eugene. Enlaces muy útiles también ¡Gracias! –

3

En principio, puede agregar información personalizada a los archivos .class (hay una sección de atributos donde puede agregar cosas). Tendrá que escribir su propia extensión compilador/compilador para hacerlo. No hay forma de agregar algo a su código fuente que luego aparecerá en el archivo de clase. También tendrá grandes problemas en la práctica:

  1. La forma de pila traza una construida/impreso no es consciente de nada se agrega al archivo de clase. Entonces, si quieres que se impriman estas cosas como se muestra arriba, tienes que hackear algunas clases básicas de JDK.
  2. ¿Cuánto detalle quieres? ¿La última persona que cometió algún cambio en un archivo determinado? Eso no es lo suficientemente preciso en la práctica, a menos que los archivos sean propiedad de un solo desarrollador.
  3. Adición de "último cometido por" información con una granularidad más fina, por ejemplo por el método, o incluso peor, por línea se hinchan rápidamente su archivo de clase (y archivos de clase están limitados en tamaño a 64K)

Como nota al margen, si culpar a las personas o no por errores ayuda a solucionar los errores más rápidamente depende en gran medida de la cultura de la organización de desarrollo. Asegúrese de trabajar en uno donde esto ayude antes de dedicar mucho tiempo a desarrollar algo como esto.

+0

Los archivos de clase no están limitados a 64K. Pero los métodos son, y este proceso podría desencadenar errores de "código demasiado grande". –

+0

Gracias por su respuesta Jochen. Realmente no planeo en realidad hacerlo. Fue solo un "qué pasaría si" que vino a mí, y quería ver qué pensaría la mente inteligente aquí. Además, para ese propósito, creo que @ srs2012 probablemente sea correcto - este tipo de información sería mejor que los archivos .class y luego uno podría tener algún tipo de "post-procesamiento" hecho en el seguimiento de la pila. –

+0

De todos modos, saber que podría ser posible agregar información personalizada a los archivos .class (no estoy hablando de anotaciones) parece interesante. Ese tipo de cosas podría tener otras aplicaciones prácticas. ¿Puedes señalar alguna documentación que diga más sobre el tema? –

1

Una forma de agregar agregar información personalizada a los archivos de su clase usando annotations en el código fuente. No sé cómo colocaría esa información de manera confiable en el seguimiento de la pila, pero podría crear una herramienta para recuperarla.

+0

Las anotaciones no funcionarían para el caso expuesto. –

0

Como @theglauber señaló correctamente, puede usar anotaciones para agregar metadatos personalizados. Aunque no estoy muy seguro de que no pueda recuperar esa información de su base de datos implementando beans y decorando su administrador de excepciones personalizado.

Cuestiones relacionadas