ProGuard 混淆及混淆后Jar包无法加载类的几种情况

一/.很多时候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...

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值