一/.很多时候java项目有很多核心的代码不想暴露给客户或者其他团队,则可以进行代码混淆.而网上的大部分方案都只能对单个jar有效.不能满足我们多个项目依赖的需要. proguard 混淆虽然加密强度不大,但是从逻辑上可以避免很容易破解.
proguard混淆插件配置
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<version>2.1.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>proguard</goal>
</goals>
</execution>
</executions>
<configuration>
<attach>true</attach>
<attachArtifactClassifier>pg</attachArtifactClassifier>
<!-- attach 的作用是在 install 与 deploy 时将生成的 pg 文件也安装与部署 -->
<options> <!-- 详细配置方式参考 ProGuard 官方文档 -->
<!--<option>-dontobfuscate</option> -->
<option>-ignorewarnings</option> <!--忽略所有告警 -->
<option>-dontshrink</option> <!--不做 shrink -->
<option>-dontoptimize</option> <!--不做 optimize -->
<option>-dontskipnonpubliclibraryclasses</option>
<option>-dontskipnonpubliclibraryclassmembers</option>
<option>-repackageclasses com.txdy.cc</option>
<!--平行包结构(重构包层次),所有混淆的类放在 pg 包下 -->
<!-- 以下为 Keep,哪些内容保持不变,因为有一些内容混淆后(a,b,c)导致反射或按类名字符串相关的操作失效 -->
<option>-keep class **.package-info</option>
<option>-keep class com.txdy.core.** { *;}</option>
<!-- <option>-keep class com.txdy.core.** { *;}</option> -->
<option>-keep class com.txdy.framework.security.** { *;}</option>
<!--保持包注解类 -->
<option>-keepattributes Signature</option>
<option>-keepattributes *Annotation*</option>
<!--JAXB NEED,具体原因不明,不加会导致 JAXB 出异常,如果不使用 JAXB 根据需要修改 -->
<!-- Jaxb requires generics to be available to perform xml parsing
and without this option ProGuard was not retaining that information after
obfuscation. That was causing the exception above. -->
<option>-keepattributes SourceFile,LineNumberTable,*Annotation*</option>
<!--
保持源码名与行号(异常时有明确的栈信息),注解(默认会过滤掉所有注解,会影响框架的注解)
<option>-keepclassmembers enum
org.noahx.proguard.example.project2.** { *;}</option>
保持枚举中的名子,确保枚举 valueOf 可以使用
<option>-keep class org.noahx.proguard.example.project2.bean.** {
*;}</option>
保持 Bean 类,(由于很多框架会对 Bean 中的内容做反射处理,请根据自己的业务调整)
<option>-keep class org.noahx.proguard.example.project2.Project2 {
public void init(); public void
destroy(); }
</option>
保持对外的接口性质类对外的类名与方法名不变
-->
</options>
<!-- <outjar>${project.build.finalName}-pg</outjar> -->
<outjar>${project.build.finalName}-pg</outjar>
<libs>
<lib>${java.home}/lib/rt.jar</lib>
</libs>
</configuration>
</plugin>
二/ 加载不到类的几种情况
1.如果其他模块项目依赖的类不能做混淆,编译器会直接报错.
2.加载不到配置/或者其他Componet组件 大部分原因是由于注解导致的,注意下面的配置
<option>-keepattributes *Annotation*</option>
3.如果有注解的情况下还找不到,则可能有由于jar的问题. 解压后用jar命令重新打包.
jar cvfm shop-core.jar MANIFEST.MF -C shop-core .(注意最后面的.)
4.还有可能找不到的情况是你的混淆包名
@ComponentScan(value = {"com.txdy","com.txdy.cc"})
ok...