使用jocky混淆java项目
程序员文章站
2022-06-17 19:28:12
...
1、什么是混淆?为什么要混淆?这个问题不多说明,简单讲,就是为了保护软件项目的所有权,防止别人反编译,将代码打乱,人看着会很费劲,但对计算机执行没有障碍。
2、当前项目的结构:项目采用的框架是ssh(spring、struts2、hibernate)的,其中还用了Annotation 注释标签。代码形如:
(1)一个bo的代码
(2)action的代码
(3)service代码
3、混淆介绍。
(1)整体混淆级别设置。设置为public的。对所有的代码混淆。具体配置文件我使用方法,参见jocky的说明文件,附件的压缩包中有。
(2)对于不需要混淆的类,加上注释 @preserve all 将其除外。如上面的bo、action代码。本项目中不能混淆的类有:
A、action类,可能是由于struts2管理的原因,如果混淆,项目会报错,找不到相应的action.
B、bo类,该类是和数据库表一一对应的,改变了,就乱了。因为用的是hibernate自动映射的。
C、其他会被jsp页面中引用到的类,如dto类,工具类,dwr类等。
(3)对于可以混淆的类,但不能混淆的方法,加上@preserve public 注释。如上面的service类。因为涉及到事务的控制,如果方法名被混淆了,在方法内改变数据的某些操作时,就会报错。本项目中在sping.xml内配置了所有service方法中,只有以save,update,delete开头的方法,才能改变数据库,否则会报错。参见如下:
2、当前项目的结构:项目采用的框架是ssh(spring、struts2、hibernate)的,其中还用了Annotation 注释标签。代码形如:
(1)一个bo的代码
/** *@preserve all */ @Entity @Table(name = "crm_code_clientSort") public class ClientSort { @Id @GeneratedValue(generator = "uuidGenerator") @GenericGenerator(name = "uuidGenerator", strategy = "uuid") @Column(length = 32) private String id;//标识 @Column(length = 6) private String code; //编号 @Column(length = 20) private String name; //名称 }
(2)action的代码
/** *@preserve all */ @Controller @Scope("prototype") @ParentPackage(value = "abc-default") @Namespace("/crm/backlog") @Results( { @Result(name = "showInfo", location = "/jsp/crm/backlog/showInfo.jsp"), @Result(name = "common", location = "/jsp/crm/backlog/list.jsp"), @Result(name = "addBacklog", location = "/jsp/crm/backlog/addBacklog.jsp"), @Result(name = "updateBacklog", location = "/jsp/crm/backlog/updateBacklog.jsp") }) @InterceptorRef("isLogin") public class BacklogAction { @Resource private CRM_BacklogService cRM_backlogService; //此对象是spring自动注入的,因为加了@Resource标签 @Resource private CodeBean codeBean; private Object fere; private Backlog dto; //以下略 }
(3)service代码
@Service public class UserService { @Resource public Dao dao; public String getTheNum() { //省略代码 return ""; } /** * @preserve public */ public void updateObject(User user) { dao.updateObject(user); } //********省略其他 }
3、混淆介绍。
(1)整体混淆级别设置。设置为public的。对所有的代码混淆。具体配置文件我使用方法,参见jocky的说明文件,附件的压缩包中有。
<property name="jocky.scramble.level" value="public"/>
(2)对于不需要混淆的类,加上注释 @preserve all 将其除外。如上面的bo、action代码。本项目中不能混淆的类有:
A、action类,可能是由于struts2管理的原因,如果混淆,项目会报错,找不到相应的action.
B、bo类,该类是和数据库表一一对应的,改变了,就乱了。因为用的是hibernate自动映射的。
C、其他会被jsp页面中引用到的类,如dto类,工具类,dwr类等。
(3)对于可以混淆的类,但不能混淆的方法,加上@preserve public 注释。如上面的service类。因为涉及到事务的控制,如果方法名被混淆了,在方法内改变数据的某些操作时,就会报错。本项目中在sping.xml内配置了所有service方法中,只有以save,update,delete开头的方法,才能改变数据库,否则会报错。参见如下:
<!-- 配置事务的传播特性 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="*" read-only="true" /> </tx:attributes> </tx:advice> <!-- 那些类的哪些方法参与事务 --> <aop:config> <aop:pointcut id="commonServiceMethod" expression="execution(* com.abc.domain.common.service.*.*(..))" /> <aop:pointcut id="khServiceMethod" expression="execution(* com.abc.domain.*.*.inside.service.*.*(..))" /> <aop:advisor pointcut-ref="commonServiceMethod" advice-ref="txAdvice" /> <aop:advisor pointcut-ref="khServiceMethod" advice-ref="txAdvice" /> </aop:config>
上一篇: 5G MEC边缘云组网方案与业务案例分析
下一篇: MongoDB数据库常用命令
推荐阅读
-
使用IDEA创建java项目的步骤详解(hello word)
-
Java Web学习之MySQL在项目中的使用方法
-
使用eclipse创建java项目的方法
-
解决Maven 项目报错 java.httpservlet和synchronized使用方法
-
使用Jenkins Pipeline自动化构建发布Java项目的方法
-
Java Web学习之MySQL在项目中的使用方法
-
java连接redis是数据库(redis在java项目中的使用)
-
java连接redis是数据库(redis在java项目中的使用)
-
解决Maven 项目报错 java.httpservlet和synchronized使用方法
-
JAVA maven项目使用钉钉SDK获取token、用户