文章目录
- 07-PDI(Kettle)源码编译8.2.0.0.R版本
- 1.安装PDI8.2.0.0.R的parent工程到本地
- 1.1配置Maven的settings.xml文件
- 1.2安装PDI源码依赖的parent工程到本地仓库
- 1.3下载并编译PDI8.2.0.0.R源码
- 1.下载源码
- 2.用idea打开--问题及解决方案
- 3.用idea运行--问题及解决方案
- 1.4运行项目
- 1.5小技巧
- 总结
- 1.安装PDI8.2.0.0.R的parent工程到本地
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中这个下载链接,新的地址如下。 下载地址
代码语言:javascript复制# 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:kettlemaven-parent-poms-8.2.0.0-Rmaven-parent-poms-8.2.0.0-Rmaven-support-files
下会看到一个settings.xml文件,这个文件中有PDI远程maven私有仓库的地址,需要将 将原maven的conf目录下setttings.xml备份,将kettle提供的setttings.xml放在conf目录下,把PDI提供的settings.xml文件放在后,可以修改下本地仓库的位置,添加
代码语言:javascript复制<localRepository>D:apachemaven-repository</localRepository>
到settings.xml中
1.2安装PDI源码依赖的parent工程到本地仓库
PDI源码目前基于Maven构建,源码的依赖来源于其父工程pentaho-ce-jar-parent-pom,进入到pentaho-ce-jar-parent-pom目录,
E:kettlemaven-parent-poms-8.2.0.0-Rmaven-parent-poms-8.2.0.0-Rpentaho-ce-parent-pompentaho-ce-jar-parent-pom
打开cmd终端,执行
代码语言:javascript复制mvn clean install
提示如下成功
代码语言:javascript复制[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.下载源码
下载地址
代码语言:javascript复制https://github.com/pentaho/pentaho-kettle/tree/8.2
或
https://gitee.com/mirrors/Kettle/tree/8.2.0.0-R/
可以直接下载,然后解压
也可以通过以下git下载,本教程采用下载后解压的方式,将压缩包放在E:kettle中,解压,将解压后的源码放在如下路径:
代码语言:javascript复制E:kettleKettle-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)
解决办法:修改依赖配置 打开:<源码目录>uipom.xml,搜索内容:
代码语言:javascript复制<dependency>
<groupId>org.eclipse.swt</groupId>
<artifactId>org.eclipse.swt.gtk.linux.x86_64</artifactId>
</dependency>
替换为:
代码语言:javascript复制 <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>
执行
代码语言:javascript复制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 ,全局查找
代码语言:javascript复制google-bigquery-plugin
将pom文件中原有的配置
代码语言:javascript复制<google-bigquery-plugin.version>${project.version}</google-bigquery-plugin.version>
修改为
代码语言:javascript复制 <google-bigquery-plugin.version>8.1.0.0-365</google-bigquery-plugin.version>
3.用idea运行–问题及解决方案
运行工程的
代码语言:javascript复制ui模块
下的
代码语言:javascript复制org.pentaho.di.ui.spoon.Spoon.java
文件,右键运行
代码语言:javascript复制Spoon.main()
即可运行项目,但运行过程中可能出现很多问题。 我的这个文件位于
E:kettleKettle-8.2.0.0-RKettle-8.2.0.0-RuisrcmainjavaorgpentahodiuispoonSpoon.java
1. 出现问题3:swt-gtk.dll 错误提示:
代码语言:javascript复制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:UsersDELL.swtlibwin32x86_64swt-gtk-4623.dll
Can't load library: C:UsersDELL.swtlibwin32x86_64swt-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: 提示错误:pluginlog4j.xml
Could not parse file [pluginskettle5-log4j-pluginlog4j.xml]. java.io.FileNotFoundException: E:kettleKettle-8.2.0.0-RKettle-8.2.0.0-Rpluginskettle5-log4j-pluginlog4j.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根目录下
代码语言:javascript复制-Djava.ext.dirs="lib":$JAVA_HOME/lib/ext
代码语言:javascript复制// Working directory:后面追加 dist
E:kettleKettle-8.2.0.0-RKettle-8.2.0.0-Rdist
参考:https://blog.csdn.net/qq_41471057/article/details/106833982
3.出现问题5 提示错误:XulException
代码语言:javascript复制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:kettleKettle-8.2.0.0-RKettle-8.2.0.0-Rassembliesclienttargetpdi-ce-8.2.0.0-342.zip
将之前编译成功的发布包 zip 中的 lib 目录下的以下 4 个 jar 文件拷贝到<源码目录>distlib 中:
代码语言:javascript复制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
代码语言:javascript复制 2021/09/18 09:12:49 - General - ERROR (version Unknown, build 0 from 2021/09/18 09:12:45.612 by DELL) : Error starting Spoon shell
2021/09/18 09:12:49 - General - ERROR (version Unknown, build 0 from 2021/09/18 09:12:45.612 by DELL) : java.lang.NoClassDefFoundError: org/jaxen/JaxenException
2021/09/18 09:12:49 - General - at org.pentaho.ui.xul.impl.AbstractXulLoader.preProcess(AbstractXulLoader.java:357)
2021/09/18 09:12:49 - General - at org.pentaho.ui.xul.impl.AbstractXulLoader.loadXul(AbstractXulLoader.java:113)
2021/09/18 09:12:49 - General - at org.pentaho.ui.xul.swt.SwtXulLoader.loadXul(SwtXulLoader.java:128)
2021/09/18 09:12:49 - General - at org.pentaho.ui.xul.swt.SwtXulLoader.loadXul(SwtXulLoader.java:122)
2021/09/18 09:12:49 - General - at org.pentaho.ui.xul.impl.AbstractXulLoader.loadXul(AbstractXulLoader.java:239)
2021/09/18 09:12:49 - General - at org.pentaho.di.ui.spoon.Spoon.init(Spoon.java:865)
2021/09/18 09:12:49 - General - at org.pentaho.di.ui.spoon.Spoon.createContents(Spoon.java:9143)
2021/09/18 09:12:49 - General - at org.eclipse.jface.window.Window.create(Window.java:426)
2021/09/18 09:12:49 - General - at org.eclipse.jface.window.Window.open(Window.java:785)
2021/09/18 09:12:49 - General - at org.pentaho.di.ui.spoon.Spoon.start(Spoon.java:9174)
2021/09/18 09:12:49 - General - at org.pentaho.di.ui.spoon.Spoon.main(Spoon.java:707)
2021/09/18 09:12:49 - General - Caused by: java.lang.ClassNotFoundException: org.jaxen.JaxenException
2021/09/18 09:12:49 - General - at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
2021/09/18 09:12:49 - General - at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
2021/09/18 09:12:49 - General - at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
2021/09/18 09:12:49 - General - at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
2021/09/18 09:12:49 - General - ... 11 more
stopping
Process finished with exit code 0
原因及解决办法:Jaxen依赖包依赖未传递成功,找到根项目下的engine下的pom.xml,找到如下依赖,注释掉test域可见的配置,使其将依赖传递至kettle-ui-swt,reload一下
代码语言:javascript复制<!-- required by org.dom4j -->
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<!--<scope>test</scope>-->
</dependency>
然后右键pom文件,reload工程
也可以在<源码目录>distlib,把依赖放在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下载
代码语言:javascript复制Home » org.eclipse.core » org.eclipse.core.commands
放在<源码目录>distlib
代码语言:javascript复制E:kettleKettle-8.2.0.0-RKettle-8.2.0.0-Rdistlib
目录下,然后在把该依赖添加到模块下
这个问题存在于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文件
代码语言:javascript复制<orderEntry type="library" exported="" name="Maven: org.eclipse.core:commands:3.3.0-i20070605-0010" level="project" />
查看maven下maven-metadata-pentaho-public.xml的元数据
代码语言:javascript复制<?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 提示错误
代码语言:javascript复制libpng warning: iCCP: cHRM chunk does not match sRGB
解决办法:
关闭qq拼音输入法
1.4运行项目
以上问题都解决后,PDI就可以基本运行了,可以通过maven打包,也可以通过Spoon.main直接run
1.5小技巧
PDI的本地国际化配置位置
E:kettleKettle-8.2.0.0-RKettle-8.2.0.0-Rpluginsjsoncoresrcmainresourcesorgpentahoditransstepsjsoninputmessagesmessages_en_US.properties E:kettleKettle-8.2.0.0-RKettle-8.2.0.0-Rpluginsjsoncoresrcmainresourcesorgpentahoditransstepsjsoninputmessagesmessages_es_AR.properties E:kettleKettle-8.2.0.0-RKettle-8.2.0.0-Rpluginsjsoncoresrcmainresourcesorgpentahoditransstepsjsoninputmessagesmessages_es_ES.properties E:kettleKettle-8.2.0.0-RKettle-8.2.0.0-Rpluginsjsoncoresrcmainresourcesorgpentahoditransstepsjsoninputmessagesmessages_fr_FR.properties E:kettleKettle-8.2.0.0-RKettle-8.2.0.0-Rpluginsjsoncoresrcmainresourcesorgpentahoditransstepsjsoninputmessagesmessages_it_IT.properties E:kettleKettle-8.2.0.0-RKettle-8.2.0.0-Rpluginsjsoncoresrcmainresourcesorgpentahoditransstepsjsoninputmessagesmessages_ja_JP.properties E:kettleKettle-8.2.0.0-RKettle-8.2.0.0-Rpluginsjsoncoresrcmainresourcesorgpentahoditransstepsjsoninputmessagesmessages_ko_KR.properties E:kettleKettle-8.2.0.0-RKettle-8.2.0.0-Rpluginsjsoncoresrcmainresourcesorgpentahoditransstepsjsoninputmessagesmessages_zh_CN.properties
如果缺少一些依赖,可以先下载到本地,再通过Maven去安装本地jar 确定依赖的jar,下载
代码语言:javascript复制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的源码编译,有问题的读者,可以留言,看到如果可以复现的话,我会及时回复的。