autowire sollte ich eine Bibliothek Common.License, die ich mit Proguard bin Verschleiern:mit einer Bibliothek verwenden Proguard hat eine @Service Bohne, die
<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>
Diese Bibliothek hat eine Spring-Bean mit @Service kommentierte:
@Service
public class LicenseServiceImpl implements LicenseService {
@Autowired(required = false)
LicenseSessionStore licenseSessionStore;
@Autowired(required = false)
LicenseStore licenseStore;
...
}
ich benutze diese Bibliothek in einem Web-Service Company.License, wo ich das License autowire wollen:
@Component
public class BackgroundTasks {
@Autowired
ScheduledExecutorService scheduledExecutorService;
@Autowired
LicenseService licenseService;
...
}
Also Company.License ist von Common.License abhängig. Wenn ich Common.License verschleiern, wird licenseService
nicht in BackgroundTasks
autowire. Die einzige Art, wie ich dieses Problem umgehen konnte, war License explizit als Bean zu definieren:
@Bean(name = "licenseService", autowire = Autowire.BY_NAME)
public LicenseService getLicenseService() {
if (licenseService == null) {
licenseService = new LicenseServiceImpl();
}
return licenseService;
}
ich nicht explizit diese wie dies als eine Bohne müssen erklären, wie ich bereits die Klasse mit @Service
welche kommentierten genug sein sollte, um die Autowiring von licenseService
in BackgroundTasks
Spring-magisch arbeiten zu lassen. Aber das tut es nicht!
Was macht Proguard speziell, damit dies nicht funktioniert? Kann ich irgendetwas in der Konfiguration von Proguard tun, um es Frühlingsfreundlicher zu machen?
Grant-
so wurde die Lösung nicht die autowiring kommentierten Klassen verschleiern:/i den Nutzen von Verschleierung nicht wirklich sehen können besonders wenn ich exten bin mit Feder IOC (für Dienstleistungen, dao etc ..) – Genjuro