Использование Proguard с библиотекой имеет компонент @Service, который должен автоматически подключаться - PullRequest
8 голосов
/ 10 декабря 2010

У меня есть библиотека 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>

Эта библиотека имеет bean-компонент Spring, аннотированный @Service:

@Service
public class LicenseServiceImpl implements LicenseService {

    @Autowired(required = false)
    LicenseSessionStore licenseSessionStore;

    @Autowired(required = false)
    LicenseStore licenseStore;

...

}

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

@Component
public class BackgroundTasks {

    @Autowired
    ScheduledExecutorService scheduledExecutorService;

    @Autowired
    LicenseService licenseService;

...

}

Таким образом, 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;
}

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

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

Grant

Ответы [ 3 ]

6 голосов
/ 13 декабря 2010

Большое спасибо Эрику Лафортуну за помощь, указав мне правильное направление:

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>

ПРИМЕЧАНИЕ!Вам нужно использовать 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 

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

<dependency>
  <groupId>net.sf.proguard</groupId>
  <artifactId>proguard</artifactId>
  <version>4.4</version>
  <scope>runtime</scope>
  <optional>true</optional>
</dependency>
1 голос
/ 14 декабря 2010

Вот еще один способ перейти на версию 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>
0 голосов
/ 02 августа 2018

У меня была та же проблема, и директива -keepdirectories помогла мне решить проблему.

...