在项目上线之前需要通过ProGuard来对java的class进行混淆,以避免反编译方式,来保护自己的代码。ProGuard网上有很多资料,可以参考:http://blog.csdn.net/zhangdaiscott/article/details/45368261。在此,记录扰码可执行JAR包出现的问题,已经相关的解决方式。

1、引用第三方库的处理方式

引用第三方库,应避免修改第三方库的类名和public的方法、参数,否则在proguard回报很多warning,而执行失败。在Eclipse打包为可执行jar包时有以下的几个选择。

Extract方式是缺省的方式,会将第三方jar包解压成为具体的*.class ,然后和我们自己的*.class一起封装成为jar。Proguard会对所有class进行扰码,因此包括了第三方jar包。

最直接的方式就是让第三方jar包不参与proguard的混淆,因此我们可以选择余下两种方式,这里我选择了Package方式。我们用7Zip对jar包进行解压,会看到第三方jar包仍以jar包的方式存在。

2、可执行main要保留

我们需要保留jar包中的资源,特别是MANIFEST.MF文件,下面是这个文件的例子:

Rsrc-Class-Path: ./ log4j-core-2.4.1.jar log4j-api-2.4.1.jar gson-2.4. jar  mysql-connector-java-5.1.37.jar

Class-Path: .

Rsrc-Main-Class: MyPackage.App

Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader

这里设计两个具有Main的可执行类MyPackage.App,和org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader(顾名思义,load第三方库的)。我们必须确保能够找到这两个类的main,也就是这两个类的全名(包名和类名)以及mian的方法名字都必须保留正确。增加一下配置即可:

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

-whyareyoukeeping class *

-keep public class MyPackage.App {

public static void main(java.lang.String[]);

}

-keep public class org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader {

public static void main(java.lang.String[]);

}

对应与GUI中,如下几图:

有些参数是可以调整的,例如可以不选择Keep parameter

3、关于Gson

如果我们采用Gson来进行Json的处理,由于Gson和类中定义的成员名字有关,如果对这些名字进行混淆,则无法正确进行Json的解析,有两种方法处理:

1)在上图中右下方的“Keep additional names and class membe names”中选择相关的类和成员。一般这些成员都是private的。

2)更合适的方式如下,在代码中加入@SerializedName

@SerializedName("clientName")

private String clientName;

@SerializedName("ServerName")

private String ServerName;

此外,对于要封装成JSON字符串的属性,必须提供getter方法,例如上面如果不提供getClientName,则json字符串中没有该属性。对应的,如果进行解析,则必须提供setter方法。

出现一个奇怪的现象待查。如果定义一个数组Vector urls,当然也给出@SerializedName("urls")。如果我们将此定义在继承类,在运行的时候会报错,如下所示。需要将此定义在基类来解决,有些奇怪,先记录下来

错误:java.lang.IllegalArgumentException: class c.d declares multiple JSON fields named h

java.lang.IllegalArgumentException: class c.d declares multiple JSON fields named h

at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:167) ~[gson-2.4.jar:?]

at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:97) ~[gson-2.4.jar:?]

at com.google.gson.Gson.getAdapter(Gson.java:360) ~[gson-2.4.jar:?]

at com.google.gson.internal.bind.ArrayTypeAdapter$1.create(ArrayTypeAdapter.java:48) ~[gson-2.4.jar:?]

at com.google.gson.Gson.getAdapter(Gson.java:360) ~[gson-2.4.jar:?]

at com.google.gson.Gson.fromJson(Gson.java:813) ~[gson-2.4.jar:?]

at com.google.gson.Gson.fromJson(Gson.java:752) ~[gson-2.4.jar:?]错误:java.lang.IllegalArgumentException: class c.d declares multiple JSON fields named h

java.lang.IllegalArgumentException: class c.d declares multiple JSON fields named h

at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:167) ~[gson-2.4.jar:?]

at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:97) ~[gson-2.4.jar:?]

at com.google.gson.Gson.getAdapter(Gson.java:360) ~[gson-2.4.jar:?]

at com.google.gson.internal.bind.ArrayTypeAdapter$1.create(ArrayTypeAdapter.java:48) ~[gson-2.4.jar:?]

at com.google.gson.Gson.getAdapter(Gson.java:360) ~[gson-2.4.jar:?]

at com.google.gson.Gson.fromJson(Gson.java:813) ~[gson-2.4.jar:?]

at com.google.gson.Gson.fromJson(Gson.java:752) ~[gson-2.4.jar:?]

相关链接:开发日志

java 扰码工具_【Developer Log】ProGuard扰码可执行JAR包相关推荐

  1. java excel 插件开发工具_程序员常用的15 种开发者工具推荐

    程序员常用的15 种开发者工具推荐:Java 线上诊断工具 Arthas.IDE 插件 Cloud Toolkit.混沌实验注入工具 ChaosBlade.Java 代码规约扫描插件.应用实时监控工具 ...

  2. java -jar 工作原理_可执行Jar包运行原理

    spring boot有一个很方便的功能就是可以将应用打成可执行的jar.那么大家有没想过这个jar是怎么运行起来的呢?本篇博客就来介绍下spring boot可执行jar包的运行原理. 1. 打可执 ...

  3. linux 测试环境启用jar_Linux下用java -jar运行可执行jar包的方法教程

    问题来源 一般来说,一个稍微大些的项目都会有一些依赖的Jar包,而在将项目部署到服务器的过程中,如果没有持续集成环境的话,也就是说服务器不支持在线编译及打包,那么需要自己上传依赖的Jar包,然而可能服 ...

  4. centos 命令行执行多个命令_命令行如何执行jar包里面的方法

    最近遇到一个尴尬的问题,由于公司机测试环境的机房迁移,导致办公区的网络跟测试环境网络之前延迟比较大,大到什么程度呢?大到不能正常使用测试环境. 由于网络组一直在排查,暂时没有答复,所以只能采取一个比较 ...

  5. java -jar 执行jar包出现 java.lang.NoClassDefFoundError

    http://www.cnblogs.com/xuzimian/p/7599304.html 我用idea工具将自己开发java程序打成一个可执行的jar包,当然用eclipse或者直接用jar命令行 ...

  6. java 执行jar包命令

    不依赖外部jar包 执行java -cp xxx.jar xxx.xxxx.xxxx.MainClass 参数一,参数二 依赖外部jar包 当main类依赖多个jar时,可以把多个jar打包到一个目录 ...

  7. java9可执行jar_单个java文件打成可执行jar包

    1 概述 使用JDK自带的jar与java将单个java文件打成可执行jar包并运行. 当然也可以使用IDE完成,使用Maven只需要一个简单的package,但是单个文件嘛,没必要这么"凶 ...

  8. java执行jar中的main_浅谈java 执行jar包中的main方法

    浅谈java 执行jar包中的main方法 通过 OneJar 或 Maven 打包后 jar 文件,用命令: java -jar ****.jar 执行后总是运行指定的主方法,如果 jar 中有多个 ...

  9. idea 执行 java jar_idea打包java可执行jar包的实现步骤

    1,在项目上鼠标右键 --> Open Module Settings 2, Artifacts --> + --> JAR --> From modules with dep ...

最新文章

  1. 技校毕业是什么学历_技校毕业了是什么学历
  2. MySQL 日志文件 说明
  3. 如何解决SVN 清理失败
  4. 在java 中调c_在Java中调用C
  5. solaris 查看CPU资源占用情况!
  6. unef螺纹_螺纹标准大全
  7. 【Unity3D 灵巧小知识点】 ☀️ | 层级面板中的 ‘小手指‘ 作用: 在Scen中将该物体设置为不可选中状态
  8. (保姆级教程)免费将pdf转化为word文档,不限页数
  9. 剑指spring源码(三)
  10. python椭圆曲线加密算法_ECC 椭圆曲线加密算法学习————安全性问题与实战...
  11. 回顾敏捷实践踩过的坑:如果重新做,我会这样做(一)
  12. 正面杠腾讯音乐与网易云音乐,抖音与快手谁能“弯道超车“?
  13. 横河电机与ICQ Consultants签署生物制药业务合作协议
  14. 亲爱的老狼-搜索引擎的区分及现在各大浏览器的引擎细分
  15. 逐梦壹号STC32四驱智能小车开发文档(一):原理图设计
  16. MySQL高可用之基于Galera复制跨地域节点分布的滥用
  17. 有没有便宜的易优cms授权(易优cms授权便宜获取)
  18. Lisp语言:列表(List)
  19. 第一次私服游戏搭建总结
  20. 树莓派开发实战项目 智能家居--简单工厂模式(简单工厂模式介绍)

热门文章

  1. 《为爱而生》 | 第一集:遇见学姐
  2. 这些东西不宜空腹吃[转]
  3. 《实用软件架构:从系统环境到软件部署 》——导读
  4. 瑞典沃尔沃轿车公司再次召回
  5. python学习笔记一——鸭子模型
  6. linux zip/unzip命令详解
  7. 美指为何坚挺100关口?黄金大涨必须拿下1700
  8. java正则贪婪匹配指定字符开头和结尾或括号中内容
  9. 74160ENT引脚设计法接成1000进制加法计数器
  10. 服务器里vm启动不了共享虚拟机,VMware Workstation Server共享服务不能启动