Ich habe eine Bibliothek Common.License, die ich mit Proguard obfuscating bin:
<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, die mit @Service annotiert ist:
@Service
public class LicenseServiceImpl implements LicenseService {
@Autowired(required = false)
LicenseSessionStore licenseSessionStore;
@Autowired(required = false)
LicenseStore licenseStore;
...
}
Ich verwende diese Bibliothek in einem Webdienst Company.License, wo ich möchte, dass der LicenseService autowire:
@Component
public class BackgroundTasks {
@Autowired
ScheduledExecutorService scheduledExecutorService;
@Autowired
LicenseService licenseService;
...
}
Company.License hat also eine Abhängigkeit von Common.License. Wenn ich Common.License verschleiere, dann licenseService
wird nicht automatisch verdrahtet in BackgroundTasks
. Die einzige Möglichkeit, dieses Problem zu umgehen, bestand darin, licenseService explizit als Bean zu definieren:
@Bean(name = "licenseService", autowire = Autowire.BY_NAME)
public LicenseService getLicenseService() {
if (licenseService == null) {
licenseService = new LicenseServiceImpl();
}
return licenseService;
}
Ich sollte dies nicht explizit als eine Bean deklarieren müssen, da ich die Klasse bereits mit @Service
was ausreichen sollte, um die Selbstverdrahtung von licenseService
en BackgroundTasks
Federleichtes Arbeiten. Aber das tut es nicht!
Was tut Proguard konkret, damit dies nicht funktioniert? Kann ich in der Konfiguration von Proguard irgendetwas tun, um es frühlingsfreundlicher zu machen?
Grant