从bin/hadoop脚本可知,Hadoop运行Jar包执行MapReduce任务的类是org.apache.hadoop.util.RunJar,其源代码在core/org/apache/hadoop/util/RunJar.java。
执行一个Jar包,其本质就是,把Jar解压缩到一个临时目录,以反射的方式获取main函数,然后执行。
[1]. 执行RunJar类的main函数。
[2]. 获取manifest:Manifest manifest = jarFile.getManifest()。
[3]. 获取要执行的类:mainClassName。
[4]. 创建workDir。
[5]. 将jar文件解压缩到wordDir:unJar(file, workDir)。
[6]. 以反射的方式获取main函数:
Method main =mainClass.getMethod("main", new Class[] {
Array.newInstance(String.class,0).getClass()
});
[7].执行main函数:main.invoke(null,new Object[] { newArgs })