有时需要修改很多jar(假设这些jar都位于lib目录)中其中一个jar中的某一个类,而且又没有原始代码或ide,这时最简单的方式是:

1 进入lib目录

# cd lib
# ls
test.jar dependency1.jar dependency2.jar

2 查看待修改jar包内类结构

$ unzip -l test.jar

or

$ vim test.jar

3 解压待修改jar包

$ mkdir test_dir
$ unzip test.jar -d test_dir

4 查看class的jdk版本

$ vi -b test_dir/package/Class.class
:%!xxd 0000000: cafe babe 0000 0032 0123 0700 0201 0023 .......2.#.....#

取第15-16位,上例即32,

5 将要修改的文件放到class同目录下(如果没有源代码可以尝试反编译),并修改

$ vi test_dir/package/Class.java

6 收集classpath

由于jar包可能非常多,所以使用命令来生成

$ ls *.jar|sed ':a;N;$!ba;s/\n/:/g'
test.jar:dependency1.jar:dependency2.jar

注linux下是:分隔,windows下是;分隔

7 编译

$ javac -help
Usage: javac <options> <source files>
where possible options include:
-g Generate all debugging info
-g:none Generate no debugging info
-g:{lines,vars,source} Generate only some debugging info
-nowarn Generate no warnings
-verbose Output messages about what the compiler is doing
-deprecation Output source locations where deprecated APIs are used
-classpath <path> Specify where to find user class files and annotation processors
-cp <path> Specify where to find user class files and annotation processors
-sourcepath <path> Specify where to find input source files
-bootclasspath <path> Override location of bootstrap class files
-extdirs <dirs> Override location of installed extensions
-endorseddirs <dirs> Override location of endorsed standards path
-proc:{none,only} Control whether annotation processing and/or compilation is done.
-processor <class1>[,<class2>,<class3>...] Names of the annotation processors to run; bypasses default discovery process
-processorpath <path> Specify where to find annotation processors
-parameters Generate metadata for reflection on method parameters
-d <directory> Specify where to place generated class files
-s <directory> Specify where to place generated source files
-h <directory> Specify where to place generated native header files
-implicit:{none,class} Specify whether or not to generate class files for implicitly referenced files
-encoding <encoding> Specify character encoding used by source files
-source <release> Provide source compatibility with specified release
-target <release> Generate class files for specific VM version
-profile <profile> Check that API used is available in the specified profile
-version Version information
-help Print a synopsis of standard options
-Akey[=value] Options to pass to annotation processors
-X Print a synopsis of nonstandard options
-J<flag> Pass <flag> directly to the runtime system
-Werror Terminate compilation if warnings occur
@<filename> Read options and filenames from file

实际命令

$ javac -cp test.jar:dependency1.jar:dependency2.jar -source 1.6 -target 1.6 -sourcepath test_dir -d test_dir test_dir/package/Class.java

8 重新打jar包

$ cd test_dir
$ zip -r test.jar ./*

9 删除临时目录和原始jar

$ cd ..
$ cp test_dir/test.jar test.jar
$ /bin/rm -rf test_dir

10 测试修改生效

最新文章

  1. 室内定位系列(三)——位置指纹法的实现(KNN)
  2. Web性能优化-合并js与css,减少请求
  3. 三部曲二(基本算法、动态规划、搜索)-1006-The Same Game
  4. [BZOJ 2456]Mode(神奇的抵销)
  5. HTML5自学笔记[ 11 ]canvas绘图基础1
  6. Mongodb 安装 以及 问题解决-摘自网络
  7. MySQL高可用解决方案(MySQL HA Solution)
  8. 通过GitHub Pages建立个人站点(详细步骤)
  9. 【ThinkingInC++】64、重载new和delete,来模仿内存的分配
  10. android dom方式创建xml
  11. 转;说说AngularJS中的$parse和$eval
  12. 深入理解extern使用方法
  13. Chloe and pleasant prizes
  14. View的相关原理(读书笔记)
  15. element-ui上传文件带token
  16. Linux学习笔记之十一————Linux常用服务器构建之ssh和scp
  17. Java Web之路(五)JSP
  18. Spring学习三
  19. kvm虚拟化平台搭建
  20. Docker学习笔记 — 开启Docker远程访问

热门文章

  1. .Net版微信支付
  2. GNU Screen Usage
  3. linux 中 如何 搜索 指定目录 下 指定文件 的 指定内容
  4. Reshaper安装后vs快捷键不起作用
  5. JS算法练习四
  6. win10和Ubuntu双系统安装过程中遇到的问题
  7. 服务器管理员密码修改后SQL_Server_2008无法启动
  8. 帮助类-从tfs获取数据
  9. mysql案例~mysql主从复制延迟概总
  10. LightOJ - 1245 Harmonic Number (II) 求同值区间的和