mc
内存编译器,编译java文件为class文件
命令选项
命令选项 | 描述 |
---|---|
-c, --classloader <hash> | 指定ClassLoader的哈希值 |
--classLoaderClass <class-name> | 指定ClassLoader的类名 |
-d, --directory <path> | 编译存放class目录 |
--encoding <encoding-name> | 源代码编码 |
-h, --help | 帮助 |
<source-files> | 源代码文件 |
实例
代码1
java
import java.util.ArrayList;
public class Test1 {
public void test(){
new ArrayList<>();
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
代码2
java
import com.alibaba.arthas.deps.ZZZ;
public class Test2 {
public void test(){
new ZZZ();
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
bash
# 直接编译代码1
[arthas@14064]$ mc -d /tmp /tmp/Test1.java
Memory compiler output:
C:\tmp\Test1.class
Affect(row-cnt:1) cost in 37 ms.
# 直接编译代码2
[arthas@14064]$ mc -d /tmp /tmp/Test2.java
Memory compiler error, exception message: Compilation Error
message: 类 Test 是公共的, 应在名为 Test.java 的文件中声明 , line: 3 ,
message: 程序包com.alibaba.arthas.deps不存在 , line: 1 ,
message: 找不到符号
符号: 类 ZZZ
位置: 类 Test , line: 5 ,
, please check $HOME/logs/arthas/arthas.log for more details.
# 找到Arthas的ClassLoader再编译
[arthas@14064]$ mc -c 435181e6 -d /tmp /tmp/Test2.java
Memory compiler output:
C:\tmp\Test2.class
Affect(row-cnt:1) cost in 16 ms.
# 编译多个文件
[arthas@14064]$ mc -c 435181e6 -d /tmp /tmp/Test1.java /tmp/Test2.java
Memory compiler output:
C:\tmp\Test1.class
C:\tmp\Test2.class
Affect(row-cnt:2) cost in 20 ms.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27