有时需要修改很多jar(假设这些jar都位于lib目录)中其中一个jar中的某一个类,而且又没有原始代码或ide,这时最简单的方式是:
1 进入lib目录
#cd lib#ls
test.jar dependency1.jar dependency2.jar
2 查看待修改jar包内类结构
$ unzip -l test.jaror$ vim test.jar
3 解压待修改jar包
$ mkdir test_dir
$ unzip test.jar-d test_dir
4 查看class的jdk版本
$ vi -b test_dir/package/Class.class:%!xxd0000000: 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: javacwhere 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 isdoing-deprecation Output source locations where deprecated APIs are used-classpath Specify where to find user class files andannotation processors-cp Specify where to find user class files andannotation processors-sourcepath Specify where to find input source files-bootclasspath Override location of bootstrap classfiles-extdirs Override location of installed extensions-endorseddirs Override location of endorsed standards path-proc:{none,only} Control whether annotation processing and/or compilation isdone.-processor [,,...] Names of the annotation processors to run; bypasses default discovery process-processorpath Specify where to find annotation processors-parameters Generate metadata forreflection on method parameters-d Specify where to place generated classfiles-s Specify where to place generated source files-h Specify where to place generated native header files-implicit:{none,class} Specify whether or not to generate class files forimplicitly referenced files-encoding Specify character encoding used by source files-source Provide source compatibility with specified release-target Generate class files forspecific VM version-profile Check that API used is available inthe specified profile-version Version information-help Print a synopsis of standard options-Akey[=value] Options to passto annotation processors-X Print a synopsis of nonstandard options-J Pass directly to the runtime system-Werror Terminate compilation ifwarnings occur
@ 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 测试修改生效