1. 下载源码  https://github.com/pentaho/pentaho-kettle/
2. 下载kettle发行版本 http://community.pentaho.com/projects/data-integration/   (主要是为了获取依赖的jar包)
以上两者版本请尽量保持一致。

源码的readme文件中描述了源码编译方法,你可以照着步骤作,此方法需要联网下载所有的依赖包,一般非常慢,多数情况会出错。本文所述方法不需要联网下载依赖包,因为几乎所有需要下载的jar包已经在发行版中了。

3. 将源码拷贝到eclipse的当前workspace目录下(如/path/to/eclipse/workspace/pentaho-kettle-master)
4. 在当前workspace中新建工程,名称与刚拷贝的目录名称相同(如pentaho-kettle-master)
此时eclipse会自动引入编译时代码目录,暂时不理会编译错误。
5. 在工程目录下新建libs目录(名称可自己自定义),此目录用于存放源码编译依赖的jar包,来源如下:
        1) 将kettle发行版本中lib目录下所有jar包复制到新建的libs目录下
        2) 将kettle发行版本中libswt目录下相应平台的swt.jar复制到新建的libs目录下(请注意jvm版本,如果系统是 win64,但jvm是32,则要选择win32下的swt.jar文件)
        3) 将kettle发行版本中plugins目录下所有插件目录中lib目录下的jar文件复制到新建的libs目录下
        4) 如要消除import中mockito相关错误,需要下载mockito-all,并复制到新建的libs目录下,参考下载地址
http://central.maven.org/maven2/org/mockito/mockito-all/1.9.5/mockito-all-1.9.5.jar 6. 在工程属性中java build path部分,libraries标签页下点击add library,选择JUnit并确定。然后点击add jars,选择libs目录下所有的jar文件(如果未显示libs目录,试试刷新工程再操作),此时基本上编译没问题了。

7. 源码中单元测试部分可能有冲突的类名,此时在工程属性中java build path部分,source标签页下,排除相应的文件即可。

8. 修改工程目录(源码目录)中的project.launch文件,重命名为<工程名>.launch,如pentaho-kettle-master.launch,然后修改内容,将所有"@@@"替换为工程名,如pentaho-kettle-master

9. 在eclipse中刷新工程,右键点击pentaho-kettle-master.launch,选择run as  工程名,如果工程编译无错误,此时应该可以启动spoon。

10. 在eclipse 工具栏中debug,run中已经有了相应的launch配置。至此kettle开发调试环境初步搭建完成。


1.2. 编译源码
将项目加载到eclipse
将kettle项目拷贝到eclipse的workspace目录下,在eclipse中新建java project,项目名称和你拷贝过来的kettle文件夹名称一致

项目导入到eclipse中会出现一个错误,如下图,将这个文件的源码全部注释掉

编译
打开build.xml, 在右边的。Outline 点击kettle->run as ->ant build

第一次编译的时候需要从网上下载几个文件,放在C:\Documents and Settings\Administrator\.subfloor,网络不好的话下载会比较慢,也可以直接文件放在C:\Documents and Settings\Administrator\下。编译完成后将bin目录下的.bat文件拷贝到Kettle目录下点击Spoon.bat运行,运行成功代表编译已近通过
用源码运行Spoon
Kettle源码工程本身可能是在linux64位机器上调试的,swt配置是linux64的库,所有在运行源码前需要修改成win32的swt,步骤如下:工程à属性àJava Build Pathàlibrariesàadd jars

然后将linux64的SWT库删除

最后打开src-uiàorg.pentaho.di.ui.spoonàSpoon.java, Run As àjava application
二.源码分析
2.1. 修改kettle界面
修改初始化界面
打开package org.pentaho.di.ui.spoon的Spoon.Java,找到main函数,该main函数为Spoon工具的入口,找到如下语句

Splash splash = new Splash(display);

该语句为spoon初始化显示的界面,跳到定义Splash.java,下面函数

canvas.addPaintListener(new PaintListener() {
publicvoid paintControl(PaintEvent e) {
String versionText = BaseMessages.getString(PKG, "SplashDialog.Version") + " " + Const.VERSION; //$NON-NLS-1$ //$NON-NLS-2$

StringBuilder sb = new StringBuilder();
String line = null;

try {
BufferedReader reader = new BufferedReader(newInputStreamReader(Splash.class.getClassLoader().getResourceAsStream("org/pentaho/di/ui/core/dialog/license/license.txt")));//$NON-NLS-1$

while((line = reader.readLine()) != null) {
sb.append(line + System.getProperty("line.separator")); //$NON-NLS-1$
}
} catch (Exception ex) {
sb.append(""); //$NON-NLS-1$
Log.warn(BaseMessages.getString(PKG, "SplashDialog.LicenseTextNotFound")); //$NON-NLS-1$
}

String licenseText = sb.toString();
e.gc.drawImage(kettle_image, 0, 0);

// If this is a Milestone or RC release, warn the user
if (Const.RELEASE.equals(Const.ReleaseType.MILESTONE)) {
versionText = BaseMessages.getString(PKG, "SplashDialog.DeveloperRelease") + " - " + versionText; //$NON-NLS-1$ //$NON-NLS-2$
drawVersionWarning(e);
} elseif (Const.RELEASE.equals(Const.ReleaseType.RELEASE_CANDIDATE)) {
versionText = BaseMessages.getString(PKG, "SplashDialog.ReleaseCandidate") + " - " + versionText; //$NON-NLS-1$//$NON-NLS-2$
}
elseif (Const.RELEASE.equals(Const.ReleaseType.PREVIEW)) {
versionText = BaseMessages.getString(PKG, "SplashDialog.PreviewRelease") + " - " + versionText; //$NON-NLS-1$//$NON-NLS-2$
}
elseif (Const.RELEASE.equals(Const.ReleaseType.GA)) {
versionText = BaseMessages.getString(PKG, "SplashDialog.GA") + " - " + versionText; //$NON-NLS-1$//$NON-NLS-2$
}

Font verFont = new Font(e.display, "Helvetica", 11, SWT.BOLD); //$NON-NLS-1$
e.gc.setFont(verFont);
e.gc.drawText(versionText, 290, 205, true);

// try using the desired font size for the license text
int fontSize = 8;
Font licFont = new Font(e.display, "Helvetica", fontSize, SWT.NORMAL); //$NON-NLS-1$
e.gc.setFont(licFont);

// if the text will not fit the allowed space
while (!willLicenseTextFit(licenseText, e.gc)) {
fontSize--;
licFont = new Font(e.display, "Helvetica", fontSize, SWT.NORMAL); //$NON-NLS-1$
e.gc.setFont(licFont); 
}

e.gc.drawText(licenseText, 290, 290, true);
}
});



1. 修改背景图片
找到ui/image/下面的kettle_splash.png,替换该图片
2. 修改版本信息
找到e.gc.drawText(versionText, 290, 205, true); 改为e.gc.drawText("海康威视数据交换平台V1.0", 290, 205, true);
3. 修改下面的描述性文字
找到e.gc.drawText(licenseText, 290, 290, true);改为e.gc.drawText("作者:海康", 290, 290, true);
4. 预览效果