[Linux/Java SE]查看JAR包内的类 | JAR 命令 | 反编译
1 查看JAR包内的类
另一个思路: 解压JAR包jar -xf <jarPath>
1-1 单JAR包
-t list table of contents for archive(列出存档内容表)
-f specify archive file name (指定存档文件名)
[root@sdc70 ~]# jar -tf catalina.jar | grep -i "HttpHeaderSecurityFilter"
org/apache/catalina/filters/HttpHeaderSecurityFilter$XFrameOption.class
org/apache/catalina/filters/HttpHeaderSecurityFilter.class
1-2 多JAR包
step1 将需要查找目标类名的JAR包放在同一目录下
step2 解析多JAR包的类及其路径,存放在1个临时文件中
find <-targetDir-> -name "*.jar" -exec jar -tf {} > ./tmpfile-multi-jar-classes.txt \;
- step3 从临时文件中查找是否存在目标类
# cat ./tmpfile-multi-jar-classes.txt | grep -i "<keyword>"
[root@sdc70 ~]# cat ./tmpfile-multi-jar-classes.txt | grep -i "HttpHeaderSecurityFilter"
org/apache/catalina/filters/HttpHeaderSecurityFilter$XFrameOption.class
org/apache/catalina/filters/HttpHeaderSecurityFilter.class
2 JAR命令说明
2-1 JAR命令详解
[root@sdc70 ~]# jar --help
Illegal option: -
Usage: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ...
Options:
-c create new archive
-t list table of contents for archive (列出存档内容表)
-x extract named (or all) files from archive (从归档文件中提取已命名(或全部)文件)
-u update existing archive (更新现有的存档)
-v generate verbose output on standard output (在标准输出上生成详细输出)
-f specify archive file name (指定存档文件名)
-m include manifest information from specified manifest file
-n perform Pack200 normalization after creating a new archive
-e specify application entry point for stand-alone application bundled into an executable jar file (为绑定到可执行jar文件的独立应用程序指定应用程序入口点)
-0 store only; use no ZIP compression
-P preserve leading '/' (absolute path) and ".." (parent directory) components from file names
-M do not create a manifest file for the entries (不为条目创建清单文件)
-i generate index information for the specified jar files (为指定的jar文件生成索引信息)
-C change to the specified directory and include the following file (更改到指定的目录并包含以下文件)
If any file is a directory then it is processed recursively.
The manifest file name, the archive file name and the entry point name are specified in the same order as the 'm', 'f' and 'e' flags.
(如果任何文件是一个目录,那么它将被递归处理。
清单文件名、存档文件名和入口点名称的指定顺序与'm'、'f'和'e'标志相同。)
Example 1: to archive two class files into an archive called classes.jar:
jar cvf classes.jar Foo.class Bar.class
Example 2: use an existing manifest file 'mymanifest' and archive all the
files in the foo/ directory into 'classes.jar':
jar cvfm classes.jar mymanifest -C foo/ .
2-2 应用场景
case1: 解压指定的JAR包到当前目录
(注:JAR命令无法指定解压的目标目录)
jar -xf /root/test/catalina.jar
亦可利用WinRAR来实现。
case2: 运行JAR包(/Java类文件)的main方法

[方法1]java -jar ****.jar [args]
适用场景: 1)运行JAR包(需指定具体JAVA类); 2)JAR包内必须指定 META-INF/MANIFEST.MF:Main-Class;
否则,会报此异常: no main manifest attribute, in hello-jar-1.0-SNAPSHOT.jar(hello-jar-1.0-SNAPSHOT.jar中没有主清单属性)
解决此异常/配置
META-INF/MANIFEST.MF:Main-Class的方式:
- [#1 事后型] 直接编辑已有JAR包进行配置。利用WinRAR解压 JAR包;在其 META-INF/MANIFEST.MF 文件内配置 Main-Class;再利用WinRAR压缩为zip压缩包,重命名为jar即可
- [#2 事前型] 普通Maven项目: pom.xml中
<build>内配置maven的插件(maven-assembly-plugin),指定 mainClass属性值- [#3 事前型] SpringBoot的Maven项目: pom.xml中
<build>内配置maven的插件(spring-boot-maven-plugin)即可Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: cn.johnnyzen.myBootApplication
java -jar myApp.jar arg_aaa arg_bbb
[方法2]java -classpath ****.jar ****.****.className [args]
适用场景: 1)运行JAR包(无需指定具体JAVA类); 2)JAR包内无需指定 META-INF/MANIFEST.MF:Main-Class
如果没有在JAR包内的META-INF/MANIFEST.MF中指定Main-Class配置时;
或者
如果JAR包中有多个main方法,运行时需指定某个特定的main方法
java -cp myApp.jar com.smbea.dubbo.bin.Console aaa bbb
-cp := -classpath
[方法3]java -Djava.ext.dirs=<多个jar包的目录> com.test.HelloWordMain
(如果用-cp,则需要写每个jar,很麻烦)
【风险】(方法3)
从结果来看,两者(-cp / -Djava.ext.dirs)的区别在于:-Djava.ext.dirs会覆盖JAVA本身的ext设置。
一般情况下程序运行并无差异,因为可以看到ext目录下也就几个jar;
但是如果使用java.security相关类时,就会发现-Djava.ext.dirs会导致library找不到进而报错。
(解决办法暂时想到2种:)
- 将相关lib复制到新的ext director。验证可行
- 配置多个director。可以使用冒号分隔(-Djava.ext.dirs=directoryA:directoryB)
case3 : 生成JAR压缩包(打包)
方式1 利用WinRAR对class文件 打JAR包
(详见本文第4章 WinRAR部分)方式2
jar cvf ./myJarName.jar ./
将当前目录下的所有文件打成jar包,jar包名为main.jar(放在工作目录下)
3 反编译: file.class → file.java
java 反编译 := java decomplier
- 需求来源
[case1]
当项目已部署时,不确定已部署的war/jar包内某个类文件中是否是预期的内容。
此时,最低成本的做法或许是:直接反编译看看~
一般,Java Web项目中,class文件在Tomcat的WEB应用此路径下: C:xx/wepapps/xxxApp/WEB-INF/classes/.../Example.class
- 前置条件
- 反编译工具 jad.exe
可到该博文处下载: Java 反编译工具几枚(class转java) - CSDN
亦可下载博主提供的: jad158g.win.zip - zip包 解压即安装 (安装包来源于:https://varaneckas.com/jad/)
- 反编译
step1 切换到jad.exe的目录下
step2 jad -o -r -s java -d src xx/wepapps/xxxApp/WEB-INF/classes/.../Example.class
(执行完毕后,jad的当前目录下会生成1个名为src的子目录,其内会存在反编译后的java文件: Example.java)

- jad 命令解析
-o:覆盖旧文件,而且不用提示确认。
-r:重新加载生成包结构。
-s (java):定义输出文件的扩展名。jad为默认扩展名,咱们反编译后,当然是要.java源文件了。
-d:输出文件的目录。src表示反编译后的所有文件都放在src目录下。
4 使用WinRAR: 查看/修改/删除| 解压/生成 JAR压缩包
- 使用WinRAR 解压/生成 JAR 压缩包
[解压]
step1 选中目标JAR包,右键
step2 (选择WinRAR)解压到当前目录
[生成/压缩]
step1 选中待压缩的目录(一般含:com / META-INF 2个目录),右键
step2 (选择WinRAR)"添加到压缩文件",选择压缩格式为"zip"【必须是zip格式】
step3 重命名zip后缀为jar,即可
- 使用WinRAR 查看/修改JAR包
step1 打开WinRAR软件
step2 WinRAR>打开压缩文件>(选中目标JAR包)>(查看/修改/删除)
5 反编译神器: Java Decomplier-GUI
- 下载地址 - Github: http://java-decompiler.github.io/


X 参考与推荐文献
- jar 查找多jar包中类的办法 - 博客园
- 使用 JAR文件 - CSDN
- jad(java decomplier) - varaneckas.com
- Java 反编译工具几枚(class转java) - CSDN
- java的class文件批量反编译成java - CSDN
- https://files.cnblogs.com/files/johnnyzen/jad158g.win.zip
- https://i.cnblogs.com/files
- 如何将多个java源文件打包成可执行jar包 - CSDN
- maven项目常用的打包方式 (有依赖与无依赖等情况) - CSDN
[Linux/Java SE]查看JAR包内的类 | JAR 命令 | 反编译的更多相关文章
- Java实现动态修改Jar包内文件内容
import java.io.*; import java.util.Enumeration; import java.util.LinkedList; import java.util.List; ...
- java打jar包,引用其他.jar文件
大家都知道一个java应用项目可以打包成一个jar,当然你必须指定一个拥有main函数的main class作为你这个jar包的程序入口. 具体的方法是修改jar包内目录META-INF下的MANIF ...
- java全栈day13----Eclipse项目的jar包导出与使用jar包
01eclipse快捷键 Ctrl+T:查看所选中类的继承树 例如,在下面代码中,选中Teacher类名,然后按Ctrl+T,就会显示出Teacher类的继承关系 * B: 查看所选中方法的源代码 ...
- 27 Java动态加载第三方jar包中的类
我加载的方法是://参数fileName是jar包的路径,processorName 是业务类的包名+类名public static A load(String fileName, String pr ...
- 替换Jar包内的文件
要替换Jar包内的文件可以用以下命令实现: jar uvf myjar.jar com/test/myclass.class 这里值得注意的是 myclass.class 必须放在com/test ...
- Java项目中如何扩展第三方jar包中的类?
有些时候你对第三方得到jar包中的类并不是很满意,想根据实际情况做一些扩展.如果说第三方的jar包已经提供了一些可扩展的类,比如提供了Interceptor,Filter或者其他的类,那么使用原生的比 ...
- 有引用外部jar包时(J2SE)生成jar文件
一.工程没有引用外部jar包时(J2SE) 选中工程---->右键,Export...--->Java--->选择JAR file--->next-->选择jar fil ...
- 冗余jar包识别神器 - loose.jar
冗余jar包识别神器 - loose.jar 场景描述 项目迭代久了,会添加各类jar包,事实上很多jar包其实根本没用到.那如何快速识别冗余的jar,以方便从项目中清除掉呢? 比如: 该简单的测试工 ...
- Eclipse用Runnable JAR file方式打jar包,并用该jar包进行二次开发
目录: 1.eclipse创建Java项目(带jar包的) 2. eclipse用Export的Runnable JAR file方式打jar包(带jar包的) 打jar包 1)class2json1 ...
- spring原理案例-基本项目搭建 02 spring jar包详解 spring jar包的用途
Spring4 Jar包详解 SpringJava Spring AOP: Spring的面向切面编程,提供AOP(面向切面编程)的实现 Spring Aspects: Spring提供的对Aspec ...
随机推荐
- 终端命令mix
Jdk(1.7) java -version Maven是否安装 mvn -v MySQL(5.7) mysql -uroot -p /Users/zhanzhanyunjiu/Documents/a ...
- FII-PRX100-D开发板FPGA的烧录和RISC-V 软件代码下载
1. 生成*.bit文件之前先RESET结果 首先,打开Vivado FII_RISCV_V2.01工程(这里以V2.01版本为例),如图1所示. 图1 FII_RISCV_V2.01工程 要生成相应 ...
- 冲刺总结-day7
完成任务:前端设计 设计系统前端,利用html和css对登录页面和进入系统操作界面进行界面化设计,使系统看起来美观.简洁. 一.设计思路 利用HTML对整个网页页面进行布局和设计内容,使用CSS对每一 ...
- php【websocket】
在PHP中,开发者需要考虑的东西比较多,从socket的连接.建立.绑定.监听等都需要开发者自己去操作完成,对于初学者来说,难度方面也挺大的.下面就简单介绍一下,可供参考 一.socket协议的简介 ...
- egret tween 屏幕震动动画 ts
let orig = { x: this.x, y: this.y }; var dir = 1; var tox = 0; var toy = 0; var count = 40; // if (n ...
- c# iis网站发布
c# iis网站发布 问题一: 有很多人在用服务器发布网站的时候,一直出现 "HTTP 错误 403.14 - Forbidden Web 服务器被配置为不列出此目录的内容",那么 ...
- drf认证与权限
1 认证 # 登录认证--->某个接口必须登录后才能房屋# 登录接口--->登录成功返回随机字符串--->携带随机字符串[认证] 通过,再继续访问某个接口# 读APIView源码时, ...
- Json对象转换模块(自编代码JsonObject.cs)
namespace 信息采集系统.Common { /// <summary> /// Json类型对象,用于其它Json对象继承 /// </summary> /// < ...
- UMA插件专题(一)——基础网格创建
什么是UMA? UMA,Unity Multipurpose Avatar,是一个开源Avatar创建框架,通过它可以实现自定义人物(或任何生物)的模型,包括换装,改变身材样貌等功能. 现在先从UMA ...
- Mysql 行号+分组行号+取Top记录 SQL
Mysql 行号+分组行号+取Top记录 SQL select * from ( SELECT (@rowNum := @rowNum + 1) as rowNum -- 全量行号 , a.col1 ...