在库中使用Proguard有一个应该自动装配的@Service bean

Gra*_*mak 8 obfuscation spring proguard autowired

我有一个库Common.License,我与Proguard混淆:

<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>
Run Code Online (Sandbox Code Playgroud)

这个库有一个用@Service注释的Spring bean:

@Service
public class LicenseServiceImpl implements LicenseService {

    @Autowired(required = false)
    LicenseSessionStore licenseSessionStore;

    @Autowired(required = false)
    LicenseStore licenseStore;

...

}
Run Code Online (Sandbox Code Playgroud)

我在Web服务Company.License中使用此库,我希望LicenseService自动装配:

@Component
public class BackgroundTasks {

    @Autowired
    ScheduledExecutorService scheduledExecutorService;

    @Autowired
    LicenseService licenseService;

...

}
Run Code Online (Sandbox Code Playgroud)

因此,Company.License依赖于Common.License.如果我混淆了Common.License,那么licenseService就不会自动装入BackgroundTasks.我可以解决这个问题的唯一方法是将licenseService显式定义为bean:

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

我不应该需要明确地声明这是一个像这样的豆,因为我已经注释的类@Service应该是足以让的自动装配licenseServiceBackgroundTasks春神奇的工作.但事实并非如此!

Proguard特别做了什么来使这不起作用?在Proguard的配置中我能做些什么来使它更适合Spring吗?

格兰特

Gra*_*mak 6

非常感谢Eric Lafortune帮助我指出了正确的方向:

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

这是工作pom文件添加,指定插件和所需的选项:

<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>
Run Code Online (Sandbox Code Playgroud)

注意!您需要使用ProGuard 4.4,最新版本的ProGuard-Maven-Plugin(2.0.4)使用4.3,因此您需要编辑:

{M2_HOME}\repository\com\pyx4me\proguard-maven-plugin\2.0.4\proguard-maven-plugin-2.0.4.pom 
Run Code Online (Sandbox Code Playgroud)

拥有4.4依赖(如下所示):

<dependency>
  <groupId>net.sf.proguard</groupId>
  <artifactId>proguard</artifactId>
  <version>4.4</version>
  <scope>runtime</scope>
  <optional>true</optional>
</dependency>
Run Code Online (Sandbox Code Playgroud)

  • 所以解决方案并没有模糊自动装配注释类:/我不能真正看到混淆的好处,特别是如果我广泛使用spring IOC(用于服务,dao等......) (6认同)