实战情况
k8s + springcloud 项目
打包依赖版本问题
更新了模块 A
依赖的 模块 B 打的jar包
,但是镜像 A
打包时,没有 mvn clean install 更新依赖包 B 或者 模块 A 在 mvn clean install 之前,没有对 B 包进行 mvn clean deploy
,导致 A 镜像依赖的 B 包 不对
查看镜像中的jar包
从服务器上下载 镜像
kubectl get po -n namespace pod_name -o yaml 得到pod 使用的镜像名
docker save 镜像名 /保存到服务器的目录/test.tar
用 scp 或者 mobaxterm 拖到win本地
查看 tar 包
用 winrar / 360压缩
打开tar 包
查看class文件
反编译工具
JD-GUI 很好用!!!!
JD-GUI
是一个用C++ 开发的 Java反编译工具
,由 Pavel Kouznetsov开发,支持Windows、Linux和苹果Mac Os三个平台。而且提供了Eclipse平台下的插件JD-Eclipse。JD-GUI 基于GPLv3开源协议,对个人使用是完全免费的
。JD-GUI主要的是提供了可视化操作,直接拖拽文件到窗口既可,
效果图如下
JAVAP
javap
是jdk自带
的一个工具,可以对代码反编译
,也可以查看java编译器生成的字节码
。javap和其他两个反编译工具最大的区别是他生成的文件并不是java文件
,也不像其他两个工具生成代码那样更容易理解。拿一段简单的代码举例,如我们想分析Java 7中的switch是如何支持String的,我们先有以下可以编译通过的源代码:
public class switchDemoString {
public static void main(String[] args) {
String str = "world";
switch (str) {
case "hello":
System.out.println("hello");
break;
case "world":
System.out.println("world");
break;
default:
break;
}
}
}
cmd 或者 bash 输入
javac Decompilation.java 编译
javap -c Decompilation.class 反编译
bash 中可以 用 javap -c Decompilation.class | grep 查找特定值
cmd 中 javap -c Decompilation.class | findstr 值
反编译 class 文件
Compiled from "Decompilation.java"
public class Decompilation {
public Decompilation();
Code:
0: aload_0
1: invokespecial #8 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: ldc #16 // String world
2: astore_1
3: aload_1
4: dup
5: astore_2
6: invokevirtual #18 // Method java/lang/String.hashCode:()I
9: lookupswitch { // 2
99162322: 36
113318802: 48
default: 82
}
36: aload_2
37: ldc #24 // String hello
39: invokevirtual #26 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
42: ifne 60
45: goto 82
48: aload_2
49: ldc #16 // String world
51: invokevirtual #26 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
54: ifne 71
57: goto 82
60: getstatic #30 // Field java/lang/System.out:Ljava/io/PrintStream;
63: ldc #24 // String hello
65: invokevirtual #36 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
68: goto 82
71: getstatic #30 // Field java/lang/System.out:Ljava/io/PrintStream;
74: ldc #16 // String world
76: invokevirtual #36 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
79: goto 82
82: return
}
javap
并没有将字节码反编译成java文件
,而是生成了一种我们可以看得懂字节码
。其实javap生成的文件仍然是字节码
,只是程序员可以稍微看得懂一些
JAD
JAD
是一个比较不错的反编译工具,只要下载 jad
,就可以实现对class文件的反编译了。还是上面的源代码,使用jad反编译后内容如下:
jad Decompilation.class
会生成一个Decompilation.jad的文件
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3)
// Source File Name: Decompilation.java
package com.yveshe;
import java.io.PrintStream;
public class Decompilation
{
public Decompilation()
{
}
public static void main(String args[])
{
String str = "world";
String s;
switch((s = str).hashCode())
{
default:
break;
case 99162322:
if(s.equals("hello"))
System.out.println("hello");
break;
case 113318802:
if(s.equals("world"))
System.out.println("world");
break;
}
}
}
看上面的代码这不就是标准的java的源代码么。这个就很清楚的可以看到原来字符串的switch是通过equals()和hashCode()方法来实现的。
PS: 但是,由于JAD已经很久不更新了
在对Java7生成的字节码进行反编译时,偶尔会出现不支持的问题
在对Java 8的lambda表达式反编译时就彻底失败
idea
直接把 class 文件拖动到 idea 窗口