2010-12-10 6 views
8

У меня есть библиотека Common.License который я запутывания с Proguard:Использование Proguard с библиотекой имеет @Service боб, который должен autowire

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

Эта библиотека имеет Spring боб с аннотацией @Service:

@Service 
public class LicenseServiceImpl implements LicenseService { 

    @Autowired(required = false) 
    LicenseSessionStore licenseSessionStore; 

    @Autowired(required = false) 
    LicenseStore licenseStore; 

... 

} 

Я использую эту библиотеку в веб-службы Company.License, где я хочу, чтобы LicenseService autowire:

@Component 
public class BackgroundTasks { 

    @Autowired 
    ScheduledExecutorService scheduledExecutorService; 

    @Autowired 
    LicenseService licenseService; 

... 

} 

Так что компания. Ликенс имеет зависимость от Common.License. Если я запутал Common.License, то licenseService не будет автоопределяться в BackgroundTasks. Единственный способ, которым я мог работать вокруг этого было определение LicenseService в явном виде боба:

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

мне не нужно явно объявить это как боб, как это, как я уже аннотированный класс с @Service, который должен быть достаточно чтобы сделать автопогрузку licenseService в BackgroundTasks Весна-волшебная работа. Но это не так!

Что делает Proguard специально для того, чтобы это не работало? Есть ли что-то, что я могу сделать в конфигурации Proguard, чтобы сделать его более дружественным к весне?

Грант

ответ

5

Большое спасибо Эрику Lafortune за помощь мне точку в правильном направлении здесь:

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

Вот рабочий ПОМ добавление файла с указанием плагина и требуемых опций :

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

ПРИМЕЧАНИЕ! Вы должны использовать Proguard 4.4, последняя версия ProGuard-Maven-плагин (2.0.4) использует 4,3 так что вам нужно отредактировать:

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

Чтобы иметь 4.4 зависимость (как это):

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

поэтому решение не было запутывание в автоматическом связывании аннотированных классов:/я не могу действительно видеть выгоду от запутывания , особенно если я расширяюсь активно использовать Spring IOC (для сервисов, dao и т. д.) – Genjuro

1

Вот еще один способ, чтобы перейти к версии 4.4 ProGuard (который, вероятно, немного лучше):

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

 Смежные вопросы

  • Нет связанных вопросов^_^