2012-09-12 21 views
3

我一直試圖混淆我們正在開發的Web應用程序(我們將允許大型客戶端將其託管在他們的服務器上),並且在衝浪,搜索和嘗試很多我無法減少錯誤的號碼,我收到: 「有7283個到類或接口解析引用」Maven + Spring中的Proguard 3大型Web應用程序

我從20K開始,所以我設法得到了一些改進...

這是pom config我正在使用:

<plugin> 
       <groupId>com.github.wvengen</groupId> 
       <artifactId>proguard-maven-plugin</artifactId> 
       <executions> 
        <execution> 
         <phase>package</phase> 
         <goals> 
          <goal>proguard</goal> 
         </goals> 
        </execution> 
       </executions> 
       <dependencies> 
        <dependency> 
         <groupId>net.sf.proguard</groupId> 
         <artifactId>proguard-base</artifactId> 
         <version>4.8</version> 
         <scope>runtime</scope> 
        </dependency> 
       </dependencies>    
       <configuration> 
        <obfuscate>true</obfuscate> 
        <includeDependency>true</includeDependency> 
        <options> 
         <option>-target 1.6</option>      
         <option>-allowaccessmodification</option> 
         <option><![CDATA[ 
          -keep public class * { 
           public <init>(...); 
           public void set*(...); 
           public void init*(...); 
           public void close*(...); 
           public ** get*(...); 
           public boolean is*(...); 
           public boolean can*(...); 
          } 
          ]]></option> 
         <option><![CDATA[ 
          -keepclassmembers class * { 
           @javax.inject.Inject *; 
           @javax.inject.Named *; 
           @org.springframework.beans.factory.annotation.Autowired *; 
           @org.springframework.beans.factory.annotation.Qualifier *; 
           @org.springframework.beans.factory.annotation.Value *; 
           @org.springframework.beans.factory.annotation.Required *; 
          } 
          ]]></option>        
         <option>-keep @org.springframework.stereotype.Service class *</option> 
         <option>-keep @org.springframework.stereotype.Controller class * </option> 
         <option>-keep @org.springframework.stereotype.Component class * </option> 
         <option>-keep @org.springframework.stereotype.Repository class *</option> 
        </options> 
        <inFilter>com/proton/**,!com/proton/protocol/**</inFilter> 
        <injar>${build.warname}.${project.packaging}</injar> 
        <outjar>${build.warname}-proguarded.${project.packaging}</outjar> 
        <outputDirectory>${project.build.directory}</outputDirectory> 
        <addMavenDescriptor>false</addMavenDescriptor> 
        <libs> 
         <lib>${java.home}/lib/rt.jar</lib> 
         <lib>${java.home}/lib/jce.jar</lib>      
         <lib>${java.home}/lib/jsse.jar</lib> 
        </libs> 
        <proguardVersion>4.8</proguardVersion> 
       </configuration> 
      </plugin> 

而結果日誌的重要組成部分: https://raw.github.com/gist/3708235/37b4cada40fa4742fd1e3ef0f24efd69fa232b28/Proguard

看來,至少是錯誤的很大一部分是從春天庫,我相信,我必須努力了很多跟上規則來解決一些動態調用,但如果有人能夠幫助解決所有這些錯誤,我會很棒。

回答

4

我忘了我有這個問題,開放的,這是我們使用的是現在的設置:我是你定的代碼適應我的春天戰項目

<plugin> 
      <groupId>com.github.wvengen</groupId> 
      <artifactId>proguard-maven-plugin</artifactId> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>proguard</goal> 
        </goals> 
       </execution> 
      </executions> 
      <dependencies> 
       <dependency> 
        <groupId>net.sf.proguard</groupId> 
        <artifactId>proguard-base</artifactId> 
        <version>4.8</version> 
        <scope>runtime</scope> 
       </dependency> 
      </dependencies>    
      <configuration> 
       <obfuscate>true</obfuscate> 
       <includeDependency>true</includeDependency> 
       <options> 
        <option>-target 1.6</option>      
        <option>-dontoptimize</option> 
        <option>-keepdirectories</option> 
        <option>-renamesourcefileattribute SourceFile</option> 
        <option>-keepparameternames</option> 
        <option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod</option> 
        <option><![CDATA[ 
         -keep public class com.proton.commons.** { public protected *; } 
         ]]></option>  
          <!-- Here comes a lot of interface packages, public classes, etc as the last one -->  
        <option><![CDATA[ 
         -keepclassmembers enum * { 
          public static **[] values(); 
          public static ** valueOf(java.lang.String); 
         }      
         ]]></option>   
        <option><![CDATA[ 
         -keepclassmembers class * { 
          @org.springframework.beans.factory.annotation.Autowired *; 
          @org.springframework.beans.factory.annotation.Qualifier *; 
          @org.springframework.beans.factory.annotation.Value *; 
          @org.springframework.beans.factory.annotation.Required *; 
          @org.springframework.context.annotation.Bean *; 
          @javax.annotation.PostConstruct *; 
          @javax.annotation.PreDestroy *; 
          @org.aspectj.lang.annotation.AfterReturning *; 
          @org.aspectj.lang.annotation.Pointcut *; 
          @org.aspectj.lang.annotation.AfterThrowing *; 
          @org.aspectj.lang.annotation.Around *; 
         } 
         ]]></option>        
        <option>-keep @org.springframework.stereotype.Service class *</option> 
        <option>-keep @org.springframework.stereotype.Controller class * </option> 
        <option>-keep @org.springframework.stereotype.Component class * </option> 
        <option>-keep @org.springframework.stereotype.Repository class *</option> 
        <option>-keep @org.springframework.cache.annotation.EnableCaching class *</option> 
        <option>-keep @org.springframework.context.annotation.Configuration class *</option> 
       <!-- Custom annotation --> 
        <option>-keep @com.proton.ks.aop.ProtonLogging class *</option> 
        <option>-keep @org.aspectj.lang.annotation.Aspect class *</option> 
        <option>-keep @java.lang.annotation.Retention class *</option> 
        <option>-keep @java.lang.annotation.Target class *</option> 
        <option>-dontwarn javax.**</option> 
        <option>-dontnote com.proton.ks.preferences.PreferenceFactory</option> 
       </options> 
       <addMavenDescriptor>false</addMavenDescriptor> 
       <libs> 
        <lib>${java.home}/lib/rt.jar</lib> 
        <lib>${java.home}/lib/jce.jar</lib>      
        <lib>${java.home}/lib/jsse.jar</lib> 
        <lib>${java.home}/lib/ext/sunjce_provider.jar</lib> 
       </libs> 
       <proguardVersion>4.8</proguardVersion> 
      </configuration> 
     </plugin> 
+0

,和它給了我總是同樣的錯誤 '引起:org.apache.maven.plugin.MojoExecutionException:混淆失敗(結果= 1) at com.github.wvengen.maven.proguard.ProGuardMojo.proguardMain(ProGuardMojo.java:675) at com.github.wvengen。 maven.proguard.ProGuardMojo.execute(ProGuardMojo.java:527) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:132 ) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208) ... 19更多',我被卡在這裏 –

1

我已經使用-dontskipnonpubliclibraryclasses解決了很多問題。