07-PDI(Kettle)源码编译8.2.0.0.R版本
博客上有很多关于PDI源码编译的文章,但大多版本较早,或是有些文件已经找不多,本博客基于2021年10月的PDI源码编译过程制作而成,并在编译过程中解决了对应的问题,解决方案放在博客最后。
1.安装PDI8.2.0.0.R的parent工程到本地
1.1配置Maven的settings.xml文件
PDI编译过程中的很多依赖需要从Maven的远程私有仓库中下载,这个私有仓库的地址包含在PDI提供的一个Settings.xml中,这个文件网络提供的下载地址大多不可用了,经过寻找,发现github中这个下载链接,新的地址如下。
下载地址
# github地址 https://github.com/pentaho/maven-parent-poms/tree/8.2.0.0-R # 码云下载地址 https://gitee.com/mirrors_pentaho/maven-parent-poms/tree/8.2.0.0-R/
可以直接下载,也可以通过git下载,本文通过连接直接下载,下载后,然后解压在E:\kettle中,打开解压后的目录,在
E:\kettle\maven-parent-poms-8.2.0.0-R\maven-parent-poms-8.2.0.0-R\maven-support-files
下会看到一个settings.xml文件,这个文件中有PDI远程maven私有仓库的地址,需要将
将原maven的conf目录下setttings.xml备份,将kettle提供的setttings.xml放在conf目录下,把PDI提供的settings.xml文件放在后,可以修改下本地仓库的位置,添加
<localRepository>D:\apache\maven-repository</localRepository>
到settings.xml中
1.2安装PDI源码依赖的parent工程到本地仓库
PDI源码目前基于Maven构建,源码的依赖来源于其父工程pentaho-ce-jar-parent-pom,进入到pentaho-ce-jar-parent-pom目录,
E:\kettle\maven-parent-poms-8.2.0.0-R\maven-parent-poms-8.2.0.0-R\pentaho-ce-parent-pom\pentaho-ce-jar-parent-pom
打开cmd终端,执行
mvn clean install
提示如下成功
[INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary: [INFO] [INFO] Pentaho Community Edition Project Parent POM For Java Projects SUCCESS [ 10.365 s] [INFO] Pentaho Community Edition Project Parent POM For Bundle Projects SUCCESS [ 1.186 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 14.797 s [INFO] Finished at: 2021-09-18T07:29:35+08:00 [INFO] Final Memory: 32M/265M [INFO] ------------------------------------------------------------------------
1.3下载并编译PDI8.2.0.0.R源码
1.下载源码
下载地址
https://github.com/pentaho/pentaho-kettle/tree/8.2 或 https://gitee.com/mirrors/Kettle/tree/8.2.0.0-R/
可以直接下载,然后解压
也可以通过以下git下载,本教程采用下载后解压的方式,将压缩包放在E:\kettle中,解压,将解压后的源码放在如下路径:
E:\kettle\Kettle-8.2.0.0-R
2.用idea打开–问题及解决方案
1. 出现问题1:
错误提示:
Could not find artifact org.eclipse.core:commands:jar:3.3.0 in pentaho-public (http://nexus.pentaho.org/content/groups/omni)
解决办法:修改依赖配置
打开:<源码目录>\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.gtk.linux.x86_64</artifactId>--> <artifactId>org.eclipse.swt.win32.win32.x86_64</artifactId> <version>4.6</version> </dependency>
执行
mvn clean install -Dmaven.test.skip=true
我是在晚上11点左右运行的,白天感觉基本无法执行成功,很多依赖无法下载
2. 出现问题2:
提示错误
Failed to execute goal on project pdi-plugins: Could not resolve dependencies for project org.pentaho.di:pdi-plugins:pom:8.2.0.0-342: Could not find artifact org.pentaho.di.plu gins:google-bigquery-plugin:zip:8.2.0.0-342 in pentaho-public (http://nexus.pentaho.org/content/groups/omni) -> [Help 1]
解决办法:
在mvnrepository 和https://nexus.pentaho.org/content/groups/omni/ 确定依赖是否存在,发现不存在,修改版本号
ctrl+shift +f ,全局查找
google-bigquery-plugin
将pom文件中原有的配置
<google-bigquery-plugin.version>${project.version}</google-bigquery-plugin.version>
修改为
<google-bigquery-plugin.version>8.1.0.0-365</google-bigquery-plugin.version>
3.用idea运行–问题及解决方案
运行工程的
ui模块
下的
org.pentaho.di.ui.spoon.Spoon.java
文件,右键运行
Spoon.main()
即可运行项目,但运行过程中可能出现很多问题。
我的这个文件位于
E:\kettle\Kettle-8.2.0.0-R\Kettle-8.2.0.0-R\ui\src\main\java\org\pentaho\di\ui\spoon\Spoon.java
1. 出现问题3:swt-gtk.dll
错误提示:
java.lang.UnsatisfiedLinkError: Could not load SWT library. Reasons: no swt-gtk-4623 in java.library.path no swt-gtk in java.library.path Can't load library: C:\Users\DELL\.swt\lib\win32\x86_64\swt-gtk-4623.dll Can't load library: C:\Users\DELL\.swt\lib\win32\x86_64\swt-gtk.dll
解决办法:
在 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】按钮。将win32的依赖移动到linux上面
如下图:
需要注意:每次 Maven 重新 Import 后调整过的顺序会被还原,需要再次手动调整。
配置完成,点击工具栏的启动按钮启动 Spoon,稍等片刻,将打开 Kettle 界面。
2.出现问题4:
提示错误:plugin\log4j.xml
Could not parse file [plugins\kettle5-log4j-plugin\log4j.xml].
java.io.FileNotFoundException: E:\kettle\Kettle-8.2.0.0-R\Kettle-8.2.0.0-R\plugins\kettle5-log4j-plugin\log4j.xml (系统找不到指定的路径。)
原因分析:
源码中Spoon的方法registerUIPluginObjectTypes()中会注册环境根目录下的plugins目录,后续扫描插件jar包时会用到。
如:BasePluginType类的方法registerPluginJars()与findAnnotatedClassFiles( String x),会对plugins下的jar文件扫描。
而编译后的项目会在target目录下存在插件jar包,但是并没有在plugins目录下存在正确的插件目录如日志插件目录kettle5-log4j-plugin、json插件目录kettle-json-plugin
所以在扫描到这些jar包后初始化时找不到对应目录下的某些文件导致出错。
解决方案:
启动失败后, IDEA 会自动添加一个启动配置,点击工具栏上的启动配置【Spoon】然后点击【Edit Configurations】
配置Spoon的启动configuration,设置Working directory项为MODULE_WORKING_DIR 即dist项目的目录,其下没有plugins目录自然扫描不到jar包,不会执行日志插件初始化操作。
这样启动的kettle是没有插件的,如果想加载插件则需要将编译后的zip包的plugins和system目录拷贝至dist根目录下
-Djava.ext.dirs="lib":$JAVA_HOME/lib/ext
// Working directory:后面追加 dist E:\kettle\Kettle-8.2.0.0-R\Kettle-8.2.0.0-R\dist
3.出现问题5
提示错误:XulException
1/09/18 09:10:11 - General - ERROR (version Unknown, build 0 from 2021/09/18 09:10:05.390 by DELL) : Error initializing transformation 2021/09/18 09:10:11 - General - ERROR (version Unknown, build 0 from 2021/09/18 09:10:05.390 by DELL) : org.pentaho.ui.xul.XulException: Can not locate Xul document [ui/spoon.xul] 2021/09/18 09:10:11 - General - at org.pentaho.ui.xul.impl.AbstractXulLoader.findDocument(AbstractXulLoader.java:512) 2021/09/18 09:10:11 - General - at org.pentaho.ui.xul.impl.AbstractXulLoader.loadXul(AbstractXulLoader.java:229) 2021/09/18 09:10:11 - General - at org.pentaho.di.ui.spoon.Spoon.init(Spoon.java:865) 2021/09/18 09:10:11 - General - at org.pentaho.di.ui.spoon.Spoon.createContents(Spoon.java:9143) 2021/09/18 09:10:11 - General - at org.eclipse.jface.window.Window.create(Window.java:426) 2021/09/18 09:10:11 - General - at org.eclipse.jface.window.Window.open(Window.java:785) 2021/09/18 09:10:11 - General - at org.pentaho.di.ui.spoon.Spoon.start(Spoon.java:9174) 2021/09/18 09:10:11 - General - at org.pentaho.di.ui.spoon.Spoon.main(Spoon.java:707) 2021/09/18 09:10:11 - General - ERROR (version Unknown, build 0 from 2021/09/18 09:10:05.390 by DELL) : Error starting Spoon shell 2021/09/18 09:10:11 - General - ERROR (version Unknown, build 0 from 2021/09/18 09:10:05.390 by DELL) : java.lang.NullPointerException 2021/09/18 09:10:11 - General - at org.pentaho.di.ui.spoon.Spoon.init(Spoon.java:918) 2021/09/18 09:10:11 - General - at org.pentaho.di.ui.spoon.Spoon.createContents(Spoon.java:9143) 2021/09/18 09:10:11 - General - at org.eclipse.jface.window.Window.create(Window.java:426) 2021/09/18 09:10:11 - General - at org.eclipse.jface.window.Window.open(Window.java:785) 2021/09/18 09:10:11 - General - at org.pentaho.di.ui.spoon.Spoon.start(Spoon.java:9174) 2021/09/18 09:10:11 - General - at org.pentaho.di.ui.spoon.Spoon.main(Spoon.java:707) stopping
解决办法:
配置源码目录
在源码目录下新建目录 dist,在 dist 目录中新建子目录 lib
编译成功的发布包 zip位于:
E:\kettle\Kettle-8.2.0.0-R\Kettle-8.2.0.0-R\assemblies\client\target\pdi-ce-8.2.0.0-342.zip
将之前编译成功的发布包 zip 中的 lib 目录下的以下 4 个 jar 文件拷贝到<源码目录>\dist\lib 中:
om4j-2.1.1.jar jaxen-1.1.6.jar slf4j-api-1.7.7.jar slf4j-nop-1.7.7.jar
将之前编译成功的发布包 zip 中的 ui 目录解压至<源码目录>\dist 中
4.出现问题6
提示错误jaxen
将之前编译成功的发布包 zip 中的 ui 目录解压至<源码目录>\dist 中 请添加图片描述4.出现问题6 提示错误jaxen 20
原因及解决办法:Jaxen依赖包依赖未传递成功,找到根项目下的engine下的pom.xml,找到如下依赖,注释掉test域可见的配置,使其将依赖传递至kettle-ui-swt,reload一下
<!-- required by org.dom4j --> <dependency> <groupId>jaxen</groupId> <artifactId>jaxen</artifactId> <!--<scope>test</scope>--> </dependency>
然后右键pom文件,reload工程
也可以在<源码目录>\dist\lib,把依赖放在lib目录下
5.出现问题7
提示错误EventManager
java: 无法访问org.eclipse.core.commands.common.EventManager
找不到org.eclipse.core.commands.common.EventManager的类文件
参考资料:
https://blog.csdn.net/andywangcn/article/details/8122238
编译Kettle的PDI DB Dialog模块失败
https://www.codercto.com/a/38106.html
与开始的错误有关系
Could not find artifact org.eclipse.core:commands:jar:3.3.0 in pentaho-public (http://nexus.pentaho.org/content/groups/omni)
在mvnrepository.com下载
Home » org.eclipse.core » org.eclipse.core.commands
放在<源码目录>\dist\lib
E:\kettle\Kettle-8.2.0.0-R\Kettle-8.2.0.0-R\dist\lib
目录下,然后在把该依赖添加到模块下
这个问题存在于org.eclipse.core:commands:jar:3.3.0-I20070605-0010中的i变为了小写导致的
问题存在于org.eclipse.core:commands:jar:3.3.0-I20070605-0010中的i变为了小写导致的
查看kettle-ui-swt中的iml文件
<orderEntry type="library" exported="" name="Maven: org.eclipse.core:commands:3.3.0-i20070605-0010" lev
查看maven下maven-metadata-pentaho-public.xml的元数据
<?xml version="1.0" encoding="UTF-8"?> <metadata modelVersion="1.1.0"> <groupId>org.eclipse.core</groupId> <artifactId>commands</artifactId> <version>3.3.0-I20070605-0010</version> <versioning> <latest>3.3.0-i20070605-0010</latest> <release>3.3.0-i20070605-0010</release> <versions> <version>3.2.0-I20060605-1400</version> <version>3.3.0</version> <version>3.3.0-I20070605-0010</version> <version>3.3.0-i20070605-0010</version> </versions> <lastUpdated>20201103145618</lastUpdated> </versioning> </metadata>
maven安装本地jar
确定依赖的jar,下载
mvn install:install-file -Dfile=D:/taobao-sdk-java-auto-20160607.jar -DgroupId=com.ganshane.specs -DartifactId=taobao-sdk-java-auto-20160607 -Dversion=1.0.0 -Dpackaging=jar
6.出现问题8
提示错误
libpng warning: iCCP: cHRM chunk does not match sRGB
解决办法:
关闭qq拼音输入法
1.4运行项目
以上问题都解决后,PDI就可以基本运行了,可以通过maven打包,也可以通过Spoon.main直接run
1.5小技巧
PDI的本地国际化配置位置
E:\kettle\Kettle-8.2.0.0-R\Kettle-8.2.0.0-R\plugins\json\core\src\main\resources\org\pentaho\di\trans\steps\jsoninput\messages\messages_en_US.properties
E:\kettle\Kettle-8.2.0.0-R\Kettle-8.2.0.0-R\plugins\json\core\src\main\resources\org\pentaho\di\trans\steps\jsoninput\messages\messages_es_AR.properties
E:\kettle\Kettle-8.2.0.0-R\Kettle-8.2.0.0-R\plugins\json\core\src\main\resources\org\pentaho\di\trans\steps\jsoninput\messages\messages_es_ES.properties
E:\kettle\Kettle-8.2.0.0-R\Kettle-8.2.0.0-R\plugins\json\core\src\main\resources\org\pentaho\di\trans\steps\jsoninput\messages\messages_fr_FR.properties
E:\kettle\Kettle-8.2.0.0-R\Kettle-8.2.0.0-R\plugins\json\core\src\main\resources\org\pentaho\di\trans\steps\jsoninput\messages\messages_it_IT.properties
E:\kettle\Kettle-8.2.0.0-R\Kettle-8.2.0.0-R\plugins\json\core\src\main\resources\org\pentaho\di\trans\steps\jsoninput\messages\messages_ja_JP.properties
E:\kettle\Kettle-8.2.0.0-R\Kettle-8.2.0.0-R\plugins\json\core\src\main\resources\org\pentaho\di\trans\steps\jsoninput\messages\messages_ko_KR.properties
E:\kettle\Kettle-8.2.0.0-R\Kettle-8.2.0.0-R\plugins\json\core\src\main\resources\org\pentaho\di\trans\steps\jsoninput\messages\messages_zh_CN.properties
如果缺少一些依赖,可以先下载到本地,再通过Maven去安装本地jar
确定依赖的jar,下载
mvn install:install-file -Dfile=D:/taobao-sdk-java-auto-20160607.jar -DgroupId=com.ganshane.specs -DartifactId=taobao-sdk-java-auto-20160607 -Dversion=1.0.0 -Dpackaging=jar
总结
本文主要实现了PDI(kettle)8.2.0.0.R源码编译,中间包含了本人遇到的问题,以及解决方案,在编译的过程中,遇到了大量的问题,并查找了大量的的文章。网络提供的资源给了我很多的参考,但直接参考存在一些小问题,或是文件无法下载,或是没有一些问题的解决方案,本文的主要目的就是希望读者可以一步到位的实现PDI的源码编译