2010-12-10 59 views
8

J'ai un Common.License de bibliothèque que je suis Dissimuler avec Proguard:L'utilisation Proguard avec une bibliothèque a un grain de @Service qui devrait lier automatiquement

<plugin> 
    <groupId>com.pyx4me</groupId> 
    <artifactId>proguard-maven-plugin</artifactId> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>proguard</goal> 
      </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <obfuscate>true</obfuscate> 
     <options> 
      <option>-dontoptimize</option> 
      <option>-renamesourcefileattribute SourceFile</option> 
      <option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod</option> 
      <option>-keep public class * { public protected *;}</option> 
      <option>-keepclassmembernames class * {java.lang.Class class$(java.lang.String); java.lang.Class class$(java.lang.String, boolean);}</option> 
      <option>-keepclassmembernames class * {com.common.license.LicenseSessionStore licenseSessionStore; com.common.license.LicenseStore licenseStore;}</option> 
      <option>-keepclassmembers enum * {public static **[] values(); public static ** valueOf(java.lang.String);}</option> 
      <option>-keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve();}</option> 
     </options> 
     <libs> 
      <lib>${java.home}/lib/rt.jar</lib> 
      <lib>${java.home}/lib/jsse.jar</lib> 
     </libs> 
     <addMavenDescriptor>false</addMavenDescriptor> 
    </configuration> 
</plugin> 

Cette bibliothèque a un grain de printemps annotée avec @Service:

@Service 
public class LicenseServiceImpl implements LicenseService { 

    @Autowired(required = false) 
    LicenseSessionStore licenseSessionStore; 

    @Autowired(required = false) 
    LicenseStore licenseStore; 

... 

} 

J'utilise cette bibliothèque dans un Company.License de service Web où je veux que le LicenseService à autowire:

@Component 
public class BackgroundTasks { 

    @Autowired 
    ScheduledExecutorService scheduledExecutorService; 

    @Autowired 
    LicenseService licenseService; 

... 

} 

So Company.License a une dépendance sur Common.License. Si j'obscurcis Common.License alors licenseService ne sera pas autowire dans BackgroundTasks. La seule façon que je pouvais travailler cela était de définir LicenseService explicitement comme un haricot:

@Bean(name = "licenseService", autowire = Autowire.BY_NAME) 
public LicenseService getLicenseService() { 
    if (licenseService == null) { 
     licenseService = new LicenseServiceImpl(); 
    } 
    return licenseService; 
} 

Je ne devrais pas avoir besoin de déclarer explicitement comme un haricot comme celui-ci comme je l'ai déjà annoté la classe avec @Service qui devrait être suffisant pour faire l'autowiring de licenseService dans BackgroundTasks Printemps magiquement travail. Mais ce n'est pas le cas!

Que fait spécifiquement Proguard pour que cela ne fonctionne pas? Y at-il quelque chose que je peux faire dans la configuration de Proguard pour le rendre plus convivial pour le printemps?

Grant

Répondre

5

Un grand merci à Eric Lafortune pour aider me diriger dans la bonne direction ici:

http://sourceforge.net/projects/proguard/forums/forum/182456/topic/2547498

est ici l'ajout de fichiers pom travail spécifiant le plug-in et les options requises :

<plugin> 
    <groupId>com.pyx4me</groupId> 
    <artifactId>proguard-maven-plugin</artifactId> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>proguard</goal> 
      </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <obfuscate>true</obfuscate> 
     <options> 
      <option>-dontoptimize</option> 
      <option>-keepdirectories</option> 
      <option>-renamesourcefileattribute SourceFile</option> 
      <option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod</option> 
      <option>-keep public class * { public protected *;}</option> 
      <option>-keepclassmembernames class * {java.lang.Class class$(java.lang.String); java.lang.Class class$(java.lang.String, boolean);}</option> 
      <option>-keepclassmembernames class * {com.common.license.LicenseService licenseService; com.common.license.LicenseSessionStore licenseSessionStore;}</option> 
      <option>-keepclassmembers enum * {public static **[] values(); public static ** valueOf(java.lang.String);}</option> 
      <option>-keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve();}</option> 
      <option>-keep @org.springframework.beans.factory.annotation.Service class *</option> 
      <option>-keep @org.springframework.stereotype.Controller class *</option> 
      <option>-keepclassmembers class * { @org.springframework.beans.factory.annotation.Autowired *; }</option> 
     </options> 
     <libs> 
      <lib>${java.home}/lib/rt.jar</lib> 
      <lib>${java.home}/lib/jsse.jar</lib> 
     </libs> 
     <addMavenDescriptor>false</addMavenDescriptor> 
    </configuration> 
</plugin> 

REMARQUE! Vous devez utiliser ProGuard 4.4, la dernière version de ProGuard-maven-plugin (2.0.4) utilise 4.3 si vous devez modifier:

{M2_HOME}\repository\com\pyx4me\proguard-maven-plugin\2.0.4\proguard-maven-plugin-2.0.4.pom 

Pour avoir la dépendance 4.4 (comme celui-ci):

<dependency> 
    <groupId>net.sf.proguard</groupId> 
    <artifactId>proguard</artifactId> 
    <version>4.4</version> 
    <scope>runtime</scope> 
    <optional>true</optional> 
</dependency> 
+5

donc la solution n'a pas été obscurcissant les classes Autowiring annotés:/Je ne vois pas vraiment l'avantage de faux-fuyants , surtout si je suis exten sivement utilisant le printemps IOC (pour les services, dao etc.) – Genjuro

1

Voici une autre façon de passer à la version 4.4 de proguard (ce qui est probablement un peu mieux):

<configuration> 
    <proguardVersion>4.4</proguardVersion> 
    <obfuscate>true</obfuscate> 
    <options> 
    ... 
    </options>  
    <libs> 
    <lib>${java.home}/lib/rt.jar</lib> 
    <lib>${java.home}/lib/jsse.jar</lib> 
    </libs> 
    <addMavenDescriptor>false</addMavenDescriptor> 
</configuration> 
<dependencies> 
    <dependency> 
    <groupId>net.sf.proguard</groupId> 
    <artifactId>proguard</artifactId> 
    <version>4.4</version> 
    <scope>runtime</scope> 
    <optional>true</optional> 
    </dependency> 
</dependencies>