La solución que voy a proponer se basa en el proyecto Yguard. También existe Proguard que se integra bien con Maven aunque, para las necesidades que tenía, se ajustaba mejor el primero.
La configuración del plugin que hay que añadir al pom.xml de Maven es la siguiente:
maven-antrun-plugin
yguard
yguard
2.3.0.1
package
in="${project.build.directory}/${project.build.finalName}.${project.packaging}"
out="${project.build.directory}/${project.build.finalName}.jar" >
replaceClassNameStrings="true">
run
Como se puede ver, este plugin se ejecuta en la fase 'package' de Maven, justo antes de generar el jar final.
No todo el código debe ser ofuscado. Esto lo tenemos que tener en cuenta sobre todo si estamos desarrollando una librería o unos beans de Spring que tienen que ser accedidos desde otros proyectos. Por ello hay que indicarle a YGuard que no ofusque las partes definidas como públicas en el código.
Si estamos trabajando con JPA y con beans definidos como entidades (@Entity) nos podemos encontrar con la desagradable sorpresa de que los atributos que tiene definidos como Columnas (@Column) son privados y por ello también se han ofuscado. Esto quiere decir que si vamos a la base de datos veremos que, en vez de los nombres de columnas que habíamos definido inicialmente, se han creado columnas en las tablas con nombres como A,B,C,D,etc...
No he encontrado una manera muy elegante para solucionar esto. Lo ideal sería especificarle a YGuard que no ofusque aquellas clases que tengan la anotación @Entity, pero no he encontrado ninguna configuración que lo permita. Si alguien sabe cómo hacer esto agradecería que lo comentara :). En cambio lo que sí se puede especificar es que no ofusque aquellas clases que acaben con Entity.
En nuestro equipo hemos llegado a la convención de que todas las clases que sean entidades terminen con el nombre Entity: (UserEntity, RoleEntity, etc...)
la configuración para especificar que no ofusque estas clases viene en la sección keep:
No hay comentarios:
Publicar un comentario