本手册描述了开源 ETL 工具 Kettle 8.3 源码编译打包及 Debug 调试运行的详细步骤。
本手册编写的目的主要为了应对以下场景:在使用开源的 Kettle 过程中如有个性化需求需要自定义部分功能模块,或者发现系统 Bug 且官方未及时提供修复时,我们需要修改源码并且重新编译打包运行。更多的时候我们需要通过 Debug 调试运行的方式来排查问题。
版权声明:本文为「微酷网」的原创文章,转载请附上原文出处链接及本声明。
原文链接:https://weiku.co/article/431/
CSDN:https://blog.csdn.net/ifu25/article/details/103239489
1、环境要求
[scode type=“green”]本手册基于 Win10 64 位操作系统编写,未在 Mac/Linux 上进行验证测试。[/scode]
以下各软件的安装及配置不在本手册范围内,请自行查阅相关文档。
Java JDK 8Intellij IDEA 2018.3Maven 3.3.9(经测试最新版3.6.2无法正常导入源码)Git
2、源码下载
Pentaho Kettle 官方仓库:https://github.com/pentaho/pentaho-kettle
强烈建议选择和下载的发布版本一致的源码分支,本手册以 8.3 为例编写。

1) 克隆源码:
打开命令行工具,定位到要存储源码的路径,使用以下 Git 命令克隆源码,并指定 8.3 分支(克隆的目的是为了以后可以同步更新)
git clone -b 8.3 https://github.com/pentaho/pentaho-kettle.git
2) 下载官方的 maven settings.xml:
此文件定义了 kettle 依赖的 pentaho 仓库地址等,下载后存放在任意位置,后面会用到。
3、IDEA 导入项目
- 打开IDEA,选择【
Import Project】

- 定位到源码所在目录点击【
ok】

- 选择
Maven点击 【Next】

- 勾选【
Import Maven projects automatically】项,然后点击【Environment settings】

- 在弹出的【
Maven environment】窗口中,选择Maven 3.3.9所在路径,勾选【User settings file】后面的【Override】,然后选择之前下载的settings.xml,后面的【Local repository】为Maven的缓存路径,可以修改也可以默认。修改完成后点击【OK】,然后点击【Next】

- 在【
Import Project】窗口直接点击【Next】

- 在【
Import Project】窗口勾选仅有的【org.pentaho.di:pdi:8.3.0.0】后点击【Next】

- 如果之前没有配置过
JDK,那么先点击新增按钮选择JDK 8的路径,选择JDK 8后点击【Next】

- 项目名称和位置不用修改,直接点击【
Next】

- 之后会打开
IDEA的主窗口,这时需要联接互联网下载项目所依赖的jar包,这个过程可能需要很长时间,所以耐心等待(可能几个小时时间)。可以点击状态栏的消息查看依赖的加载过程(但看不到进度)。

- 导入完成后如下图

4、编译打包
通过 IDEA 的 Terminal 运行以下命令进行编译。
mvn clean install -DskipTests

打包过程仍会下载大量依赖文件,请耐心等待。

如果运气好的话,编译完成如下图,如果运行不好可能会出现条种问题,大多数是网络问题造成的,重新运行命令再试。

最终编译打包后的文件为:<源码目录>\assemblies\pdi-ce\target\pdi-ce-8.3.0.0-SNAPSHOT.zip

5、Debug 调试运行
IDEA 中打开文件:<源码目录>\ui\src\main\java\org\pentaho\di\ui\spoon\Spoon.java,点击 class 前面的【运行】按钮启动项目

这时会启动失败,不过 IDEA 会自动添加一个启动配置,点击工具栏上的启动配置【Spoon】然后点击【Edit Configurations】

在打开的【Run/Debug Configurations】窗口中进行以下设置:
VM options:-Djava.ext.dirs="lib"Working directory:后面追加dist

在源码目录下新建目录 dist,在 dist 目录中新建子目录 lib
将之前编译成功的发布包 zip 中的 ui 目录解压至<源码目录>\dist 中
将之前编译成功的发布包 zip 中的 lib 目录下的以下 4 个 jar 文件拷贝到<源码目录>\lib 中:
dom4j-2.1.1.jar
jaxen-1.1.6.jar
slf4j-api-1.7.7.jar
slf4j-nop-1.7.7.jar
Kettle发布包默认没有提示连接 Sql Server 数据库的驱动,如果需要使用 Sql Server 数据库需要从网上下载 MSSQL 驱动【mssql-jdbc-7.4.1.jre8.jar】放上述目录。


打开:<源码目录>\ui\pom.xml,搜索内容:
<dependency>
<groupId>org.eclipse.swt</groupId>
<artifactId>org.eclipse.swt.gtk.linux.x86_64</artifactId>
</dependency>
替换为:
<dependency>
<groupId>org.eclipse.swt</groupId>
<artifactId>org.eclipse.swt.win32.win32.x86_64</artifactId>
<version>4.6</version>
</dependency>

在 IDEA 中打开菜单【File - Project Structure】(也可以直接按快捷键:Ctrl+Alt+Shift+S)
在弹出的【Project Structrue】窗口中左侧选择【Modules】,然后在中间选择【kettle-ui-swt】模块,然后在右侧切换到【Dependencies】标签页,拖动右侧滚动条至大约快到底部的位置,找到【Maven:org.eclipse.swt:org.eclipse.swt.win32.win32.x86_64:4.6】,然后通过鼠标点击并拖动的方式将其移动到【Maven:org.eclipse.swt:org.eclipse.swt.gtk.linux.x86_64:4.6】的前面,然后点击【ok】按钮。

配置完成,点击工具栏的启动按钮启动 Spoon,稍等片刻,将打开 Kettle 界面。
最终 Debug 调试启动界面:

如有需要,可找到对应的代码文件添加断点进行单步调试,以便排查问题。此文档不再展开描述。
6、常见问题
1、IDEA 导入项目失败

解决方案:
可能的原因是使用了高版本的 Maven,切换底版本(建议3.3.9)重试。
2、Failed to load class “org.slf4j.impl.StaticLoggerBinder”

解决方案:
缺少 slf4j-api-1.7.7.jar、slf4j-nop-1.7.7.jar 这两个包。
3、编译过程中下载大文件网络出错

解决方案:
多试几次,或者自己从 Pentaho 官方仓库找到下载失败的下载文件下载后放到 Maven 缓存目录中。
如下载:pentaho-big-data-plugin-8.3.0.0-20191113.103442-390.zip
放到:D:\Maven\Repository\pentaho\pentaho-big-data-plugin\8.3.0.0-SNAPSHOT\
4、Cant’t load library:C:\Users\Admin.swt\lib\win32\x86_64\swt-gtk.dll

解决方案:
确认 kettle-ui-swt 项目依赖项中 win 和 linx 的 swt 包的加载顺序。
org.eclipse.swt.win32.win32.x86_64 需移动到 org.eclipse.swt.gtk.linux.x86_64 的前面。
需要注意:每次 Maven 重新 Import 后调整过的顺序会被还原,需要再次手动调整。
5、各种 ClassNotFoundException
可能会遇到各种各样的 ClassNotFoundException,遇到这个错就查看一下缺少哪个 jar 包,从发布包的 lib 目录中搜索找到需要的 jar 包后拷贝到<源码目录>\dist\lib即可。
比如微酷被这个异常折磨了好久:

7、插件
比如 json 输出/输出现在是以插件的方式运行的,默认调试启动的 Kettle 是没有 JSON 的,调试运行插件的方法也很简单。
在 dist 目录下新建 plugins 目录,然后从编译的发布包中解压出 plugins 中对应的插件放到这个目录中即可。

放上插件后调试运行可能又会报各种 ClassNotFoundException,不要着急,按上面讲的解决方案慢慢处理。
本文详细介绍了开源ETL工具Kettle8.3的源码编译、打包及Debug调试运行步骤,适用于自定义功能或修复Bug场景。涵盖环境搭建、源码下载、IDEA项目导入、编译打包、调试运行等环节。

1238

被折叠的 条评论
为什么被折叠?



