zoukankan      html  css  js  c++  java
  • idea使用maven proguard 对ssm项目进行代码混合详细步骤

    第一步:在pom.xml中配置proguard 

    需要注意的是ProGuard混淆插件的节点是放置在:build > plugins  下面,而不是在build >pluginManagement >plugins  下面,如果放置错误的话无法生成混合后的jar包。放置位置如下图所示:

     

    ProGuard混淆插件节点详细配置如下:  
      <!-- ProGuard混淆插件-->
                <plugin>
                    <groupId>com.github.wvengen</groupId>
                    <artifactId>proguard-maven-plugin</artifactId>
                    <version>2.0.14</version>
                    <executions>
                        <execution>
                            <!-- 混淆时刻,这里是打包的时候混淆-->
                            <phase>package</phase>
                            <goals>
                                <!-- 使用插件的什么功能,当然是混淆-->
                                <goal>proguard</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <proguardVersion>6.0.2</proguardVersion>
                        <!-- 是否将生成的PG文件安装部署-->
                        <attach>true</attach>
                        <!-- 是否混淆-->
                        <obfuscate>true</obfuscate>
                        <!-- 指定生成文件分类 -->
                        <attachArtifactClassifier>pg</attachArtifactClassifier>
                        <options>
                            <!-- JDK目标版本1.8-->
                            <option>-target 1.8</option>
                            <!-- 不做收缩(删除注释、未pluginManagement被引用代码)-->
                            <option>-dontshrink</option>
                            <!-- 不做优化(变更代码实现逻辑)-->
                            <option>-dontoptimize</option>
                            <!-- 不路过非公用类文件及成员-->
                            <option>-dontskipnonpubliclibraryclasses</option>
                            <option>-dontskipnonpubliclibraryclassmembers</option>
                            <!-- 优化时允许访问并修改有修饰符的类和类的成员 -->
                            <option>-allowaccessmodification</option>
                            <!-- 确定统一的混淆类的成员名称来增加混淆-->
                            <option>-useuniqueclassmembernames</option>
                            <!-- 不混淆所有包名,本人测试混淆后WEB项目问题实在太多,毕竟Spring配置中有大量固定写法的包名-->
                            <option>-keeppackagenames</option>
                            <!-- 不混淆所有特殊的类-->
                            <option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,!LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod</option>
                            <!-- 不混淆所有的set/get方法-->
                            <option>-keepclassmembers public class * {void set*(***);*** get*();}</option>
    
                            <!-- 不混淆包下的所有类名,且类中的方法也不混淆-->
                            <option>-keep class com.eggtwo.euq.interceptor.** { &lt;methods&gt;; }</option>
                            <option>-keep class com.eggtwo.euq.dao.** { &lt;methods&gt;; }</option>
                            <option>-keep class com.eggtwo.euq.data.** { &lt;methods&gt;; }</option>
    
    
                            <!-- 不混淆包中的所有类以及类的属性及方法,实体包-->
                            <option>-keep class com.eggtwo.euq.entity.** {*;}</option>
                            <option>-keep class com.eggtwo.euq.dto.** {*;}</option>
                            <!--                        <option>-keep class com.eggtwo.euq.action.BaseController {*;}</option>-->
    
                            <!-- 不对包类的类名进行混淆,但对类中的属性和方法混淆-->
                            <!--                        <option>-keep class com.eggtwo.euq.service.** </option>-->
    
    
                            <!--                        不混淆类TagUtil和方法-->
                            <option>-keep class com.eggtwo.euq.utils.TagUtil { &lt;methods&gt;; }</option>
                            <option>-keep class com.eggtwo.euq.utils.EnumUtil { &lt;methods&gt;; }</option>
    
                            <!--不显示警告信息,如果显示则会出现Error无法完成混淆!-->
                            <option>-dontwarn **</option>
                        </options>
    
                        <!-- 添加依赖,这里你可以按你的需要修改,这里测试只需要一个JRE的Runtime包就行了 -->
                        <!-- 添加依赖,这里你可以按你的需要修改,这里测试只需要一个JRE的Runtime包就行了 -->
                        <libs>
                            <lib>${java.home}/lib/rt.jar</lib>
                            <lib>${java.home}/lib/jce.jar</lib>
                        </libs>
                        <!-- 加载文件的过滤器,就是你的工程目录了-->
                        <inFilter>com/eggtwo/euq/**</inFilter>
                        <!-- 对什么东西进行加载,这里仅有classes成功,毕竟你也不可能对配置文件及JSP混淆吧-->
                        <injar>classes</injar>
                        <outjar>${project.build.finalName}-pg.jar</outjar>
                        <!-- 输出目录-->
                        <outputDirectory>${project.build.directory}</outputDirectory>
                    </configuration>
    
                </plugin>


    注意:如果需要混淆方法内的局部变量及方法参数变量,需要将 
    <option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod</option>

    改成:

    <option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,!LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod</option>

    这样就混淆时就不会排除变量了。

    但是这样又会出现一个问题,对应web项目,action中的参数是由前端请求过来的,如果使用spring mvc的自动解析功能则会出现找不到对应的参数,这时就需要通过request.getParameter来解析方法参数。

    第二步:执行命令生成pg.jar

    在如下命令行中输入:mvn clean package -DskipTests

    显示绿色的 BUILD  SUCCESS则代表混淆成功

     混淆的结果如下图所示:

    混淆文件在t项目的arget目录下面

     将pg.jar中解压的class文件替换war中的class文件,重新上传到tomcat

    参考文章:https://cloud.tencent.com/developer/article/1343115

    http://www.360doc.com/content/17/1201/15/16915_708968700.shtml

    需要注意的地方:

    1.jsp中如果直接引用了java代码,则相关的类不能混淆

    2.因为方法参数及内部变量都做了混淆,所以action在接收参数的时候不能直接使用默认的参数绑定,

    可以使用request.getParameter或者@RequestParam(value = "表单中的name", required = false) String paraName

  • 相关阅读:
    POJ 1015 Jury Compromise【DP】
    POJ 1661 Help Jimmy【DP】
    HDU 1074 Doing Homework【状态压缩DP】
    HDU 1024 Max Sum Plus Plus【DP,最大m子段和】
    占坑补题。。最近占的坑有点多。。。
    Codeforces 659F Polycarp and Hay【BFS】
    Codeforces 659E New Reform【DFS】
    Codeforces 659D Bicycle Race【计算几何】
    廖大python实战项目第四天
    廖大python实战项目第三天
  • 原文地址:https://www.cnblogs.com/eggTwo/p/13685557.html
Copyright © 2011-2022 走看看