Je possède une application Spring Boot, avec une entité JPA A qui a une relation avec une entité B incluse dans un jar obfusqué.
Je reçois l'erreur courante "@OneToOne ou @ManyToOne sur A fait référence à une entité inconnue : B" lorsque Hibernate s'initialise.
L'erreur se produit strictement lorsque j'obfuscate le jar avec Proguard.
Dans ma configuration Proguard, j'utilise déjà ceci pour préserver toutes les classes annotées avec la persistance, et les annotations de runtime:
-keepattributes RuntimeVisibleAnnotations
-keep @javax.persistence.* class * {
*;
}
Si je décompile le code, je vois que les annotations JPA sont là mais l'entité n'est toujours pas trouvée.
J'ai également essayé de préserver toute l'entité avec ceci :
-keep class B
Mais l'erreur persiste. Je ne sais pas ce qui est encore modifié par Proguard dans le jar qui empêche Hibernate de trouver l'Entité.
BTW dans Spring Boot j'utilise @EntityScan avec le nom de package explicite.
MISE À JOUR AVEC LA SOLUTION
La solution était d'ajouter :
-keepdirectories
Les entrées de répertoire sont supprimées par défaut dans le processus d'obfuscation pour réduire la taille du jar de sortie. Sans les répertoires, Spring Boot était incapable de trouver les entités configurées avec le scan du chemin.
Un problème similaire a été signalé et résolu ici : ProGuard : Obfuscated jar is not working but un-obfuscated jar is working