一、概述
开源产品总是让人欢喜让人忧。 喜的是低成本,忧的是低成熟度。 所以,不少有Java基础的K友都在研究源代码。 掌控源代码,当然是最靠谱的,但对技术水平要求非常高。笔者希望通过介绍Kettle程序启动的基本原理,为源代码研究者打开一扇窗户,一窥源代码的究竟。 以下内容以Spoon为例,但原理适用于Kitchen、Pan、Carte等所有其他应用。二、环境
硬件:处理器 Intel i7-7700HQ 2.8GHz 内存32G操作系统:Windows 7 x64 旗舰版。内部版本6.1.7601,SP1Java版本:1.8.0_181 HotSpot 64-Bit mixed mode 三、原理解析1、批处理文件set-pentaho-env.bat
批处理文件一般不会单独执行,因为它的功能是进行环境配置。但是大多数Kettle相关的批处理都会先执行此脚本,以设置以下两个环境变量:
_PENTAHO_JAVA_HOME
_PENTAHO_JAVA
前者是Java环境路径,一般是JDK/JRE所在绝对路径;后者表示启动Java进程需要的java.exe/javaw.exe文件所在绝对路径。由于并不确定用户到底需要使用java.exe还是javaw.exe,所以脚本单独定义了__LAUNCHER环境变量表达此选择。
脚本将按照以下顺序搜索__LAUNCHER的位置:
第一个命令行参数的bin文件夹下
PENTAHO_JAVA_HOME环境变量的bin文件夹下
当前路径下的jre/bin文件夹下
当前路径下的java/bin文件夹下
当前路径上级目录下的jre/bin文件夹下
当前路径上级目录下的java/bin文件夹下
当前路径上上级目录下的jre/bin文件夹下
当前路径上上级目录下的java/bin文件夹下
JAVA_HOME环境变量的bin文件夹下
JRE_HOME环境变量的bin文件夹下
2、批处理文件Spoon.bat
首先会调用相同路径下的批处理文件set-pentaho-env.bat以设置环境变量。接下来一个重要的工作是查找合适的GUI依赖库。
由于Spoon中涉及GUI图形界面,其实现技术为SWT。而SWT的库是依赖于操作系统的,Linux、苹果os、Windows32和Windows64都需要使用不同的库,所以必须通过一定的手段找到当前JRE环境的操作系统版本。下图为批处理的主要代码:
操作系统明确后,就可以确定适当的SWT库路径,并设置到环境变量LIBSPATH中。
最后,在设置好适当的参数后,启动当前路径的launcher下JAR包launcher.jar。主要命令注释如下图:
3、程序入口Launcher类
程序入口org.pentaho.commons.launcher.Launcher类的代码如下图所示:
主要代码解释如下:
第50行:从命令行参数获取值。主要包括-main(指定主类)-lib(指定JAR包查找加载路径)-cp(类路径)
第53-59行:从配置文件launcher.properties中获取参数值
第67-71行:合并所有库加载参数,设置当前线程的类加载器
第84-88行:加载配置的主类,调用其main方法
从代码上看,优先级最高的是系统参数、其次是配置文件、再其次是命令行参数。下图为kettle8.2.0.0的配置文件截图:
从中可以看出,当前配置设置的主类是org.pentaho.di.ui.spoon.Spoon。所以源码研究可以从这个类的main方法开始。
四、总结本文通过对Windows下Spoon.bat的启动过程进行分析,介绍了批处理文件的基本结构以及最终Java程序入口的查找方法。