这个类是个比较普通的类,但是管理了Hadoop的版本信息,包括用户、编译时间、版本信息等内容。在这个类中,封装了HadoopVersionAnnotation这个注释类。由于个人觉得这个设置挺巧妙,值得学习,所以特别拿出来说明进行分享。
下面就VersionInfo的几个调用场景进行说明
(1)打印系统版本信息。运行hadoop VERSION时,对应的执行类即为VersionInfo在main中直接打印消息。
public static void main(String[] args) {
System.out.println("Hadoop " + getVersion());
System.out.println("Subversion " + getUrl() + " -r " + getRevision());
System.out.println("Compiled by " + getUser() + " on " + getDate());
System.out.println("From source with checksum " + getSrcChecksum());
}
(2)在namenode等后台进程启动时,会调用StringUtils.startupShutdownMessage(NameNode.class, argv, LOG);打印当前的进程和系统消息。
其中startupShutdownMessage打印进程启动或停止的消息日志。
当进程启动时:
LOG.info(
toStartupShutdownString("STARTUP_MSG: ", new String[] {
"Starting " + classname, //打印类名
" host = " + hostname, //机器名和IP地址
" args = " + Arrays.asList(args), //参数列表
" version = " + VersionInfo.getVersion(), //后面的都是从VersionInfo获取的系统信息。
" build = " + VersionInfo.getUrl() + " -r "
+ VersionInfo.getRevision()
+ "; compiled by '" + VersionInfo.getUser()
+ "' on " + VersionInfo.getDate()}
)
);
当进程停止时,执行run中的内容。可以搜索addShutdownHook,即可理解这部分代码。这个部分和VersionInfo无关,只是顺便说明。
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
LOG.info(toStartupShutdownString("SHUTDOWN_MSG: ", new String[]{
"Shutting down " + classname + " at " + hostname}));
}
});
好了,到此为止,对VersionInfo的功能进行了介绍,下面介绍其工作的原理。
(3)VersionInfo的工作原理。
定义了静态变量:myPackeage和version。其中version是HadoopVersionAnnotation的实例。HadoopVersionAnnotation是Annotation接口类,在这里,hadoop项目组通过这种方式来获取系统版本信息。并不是直接写在代码中。后面会说到,这实际是从build过程就开始的工作。
private static Package myPackage;
private static HadoopVersionAnnotation version;
static {
myPackage = HadoopVersionAnnotation.class.getPackage();
version = myPackage.getAnnotation(HadoopVersionAnnotation.class);
}
/**
* Get the meta-data for the Hadoop package.
* @return
*/
static Package getPackage() {
return myPackage;
}
/**
* Get the Hadoop version.
* @return the Hadoop version string, eg. "0.6.3-dev"
*/
//代码较多,这里就取getVersion()方法来说明,实际是获取了HadoopVersionAnnotation实例的version()方法的返回值。
public static String getVersion() {
return version != null ? version.version() : "Unknown";
}
}