2010-12-09 55 views
6

J'utilise Proguard pour masquer une bibliothèque qui contient plusieurs champs @Autowired. L'obfuscator est en train de renommer ces champs de classe (parce qu'ils sont privés/internes à la classe) et donc mon bean ne parvient pas à instancier.Utilisation de Proguard avec une bibliothèque qui utilise Spring @Autorisé par son nom

Pré-brouillées:

@Service 
public class LicenseServiceImpl implements LicenseService { 

    @Autowired(required = false) 
    LicenseSessionStore licenseSessionStore; 

    @Autowired(required = false) 
    LicenseStore licenseStore; 

... 
} 

post-obscurcissement:

@Service 
public class LicenseServiceImpl implements LicenseService { 

    @Autowired(required=false) 
    LicenseSessionStore a; 

    @Autowired(required=false) 
    LicenseStore b; 

... 
} 

Maintenant il y a probablement beaucoup de façons de rendre ces domaines particuliers ne s'autowired mais ce que j'espérais trouver était un moyen de dire à Proguard de ne pas obscurcir les champs internes qui sont annotés avec des Spring-isms importants (@Autowired, etc.).

Quelqu'un at-il une idée sur la façon dont je peux le faire génériquement?

Grant

Répondre

2

Je ne considère pas une bonne réponse à ma question et serait encore comme une solution générique élégante, à ce problème. Ce que je publie est ma solution de contournement temporaire qui m'a fait passer mon problème de la manière la plus brutale, de manière inélégante.

J'exclus explicitement ces articles de faux-fuyants en les ajoutant dans une option keepclassmembernames:

<option>-keepclassmembernames class * {com.common.license.LicenseSessionStore licenseSessionStore; com.common.license.LicenseStore licenseStore; }</option> 

Ce n'est pas une solution privilégiée, car elle exige primordiale nommée dans chaque classe et deviendra un cauchemar de maintenance.

Une meilleure réponse est encore nécessaire!

Grant

3

J'ai eu un problème similaire en conservant les noms de classe pour les classes annotées simplexml. Mon solution était d'ajouter ce qui suit:

-keepclassmembers class * { 
    @org.simpleframework.xml.* *; 
} 

Je pense que quelque chose de semblable fonctionnerait pour vous:

-keepclassmembers class * { 
    @org.springframework.beans.factory.annotation.* *; 
}