2016-11-11 276 views
1

伙计们,我试图用proguard-maven-plugin来混淆.jar应用程序。
当我尝试执行混淆过程时,出现错误消息,指出存在意外的类。ProGuard + Spring Boot + Maven插件

我使用Spring Boot 1.4.1.RELEASE和Proguard Maven Plugin 2.0.13。

这是我proguard.conf

-injars /workspace/base/target/test-1.0.0.jar 

-libraryjars /Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home/jre/lib/rt.jar 

-dontshrink 
-dontoptimize 
-dontobfuscate 
-dontusemixedcaseclassnames 
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod 

-adaptresourcefilenames **.properties 
-adaptresourcefilecontents **.properties,META-INF/MANIFEST.MF 

-dontpreverify 
-verbose 


-keepclasseswithmembers public class * { 
    public static void main(java.lang.String[]); 
} 

-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

-keep class * extends java.beans.BeanInfo 

-keep class * { 
    void set*(***); 
    void set*(int,***); 
    boolean is*(); 
    boolean is*(int); 
    *** get*(); 
    *** get*(int); 
} 

-assumenosideeffects public class java.lang.System { 
    public static long currentTimeMillis(); 
    static java.lang.Class getCallerClass(); 
    public static int identityHashCode(java.lang.Object); 
    public static java.lang.SecurityManager getSecurityManager(); 
    public static java.util.Properties getProperties(); 
    public static java.lang.String getProperty(java.lang.String); 
    public static java.lang.String getenv(java.lang.String); 
    public static java.lang.String mapLibraryName(java.lang.String); 
    public static java.lang.String getProperty(java.lang.String,java.lang.String); 
} 

的pom.xml文件。我只通过插件通知配置。

<plugin> 
    <groupId>com.github.wvengen</groupId> 
    <artifactId>proguard-maven-plugin</artifactId> 
    <version>2.0.13</version> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>proguard</goal> 
      </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <obfuscate>false</obfuscate> 
     <outFilter>**/BOOT-INF/classes/ **.class</outFilter> 

     <proguardInclude>${basedir}/proguard.conf</proguardInclude> 
     <outputDirectory>${project.build.directory}</outputDirectory> 

     <injar>${project.build.finalName}.jar</injar> 
     <outjar>${project.build.finalName}-min.jar</outjar> 
    </configuration> 
</plugin> 

但是,在执行过程中,我的应用程序中的所有类都得到以下返回。

Warning: class [BOOT-INF/classes/br/com/base/BaseApplication.class] unexpectedly contains class [br.com.base.BaseApplication] 
Warning: class [BOOT-INF/classes/br/com/base/controller/CaixaController.class] unexpectedly contains class [br.com.base.controller.CaixaController] 
[...] 

和ProGuard的最终输出。 PS:所有的类都在BOOT-INF/classes目录

Warning: there were 97 classes in incorrectly named files. 
You should make sure all file names correspond to their class names. 
The directory hierarchies must correspond to the package hierarchies. 
    (http://proguard.sourceforge.net/manual/troubleshooting.html#unexpectedclass) 
If you don't mind the mentioned classes not being written out, 
you could try your luck using the '-ignorewarnings' option. 
Please correct the above warnings first. 

谁能想象任何替代方案,我可以试试吗? 谢谢。

回答

4

为了解决这个问题,我一定要改变pom中插件的顺序。该proguard插件应该首先,其次是春季启动插件。

此外,请确保您在弹簧引导配置中指定了<goal>repackage</goal>。按照正确的顺序和指定的重新打包目标,proguard混淆/优化/您配置的任何内容都将发生并生成一个jar。然后,弹簧启动插件将重新打包该jar作为一个可执行文件,一切都应该工作。从pom.xml的

我的插件配置:

<project ...> 
.... 
<plugin> 
    <groupId>com.github.wvengen</groupId> 
    <artifactId>proguard-maven-plugin</artifactId> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>proguard</goal> 
      </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <proguardInclude>${basedir}/proguard.conf</proguardInclude> 
     <libs> 
      <lib>${java.home}/lib/rt.jar</lib> 
      <lib>${java.home}/lib/jce.jar</lib> 
     </libs> 
    </configuration> 
</plugin> 
<plugin> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-maven-plugin</artifactId> 
    <executions> 
     <execution> 
      <goals> 
       <goal>repackage</goal> 
      </goals> 
      <configuration> 
       <start-class>org.springframework.boot.loader.JarLauncher</start-class> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 
...