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
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