2010-12-10 5 views
8

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-

Antwort

5

Ein großes Dankeschön an Eric Lafortune für hier in die richtige Richtung zeigen Sie mir helfen:

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

Hier ist die Arbeits pom-Datei zusätzlich die Angabe des Plug-in und die Optionen erforderlich :

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

HINWEIS! Sie müssen ProGuard 4.4 verwenden, die neueste Version von ProGuard-Maven-Plugin (2.0.4) verwendet 4.3 so müssen Sie bearbeiten:

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

die 4.4 Abhängigkeit haben (wie diese):

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

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

1

Hier ist eine andere Art und Weise auf die Version 4.4 von proguard zu wechseln (was wahrscheinlich ein bisschen besser ist):

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