07-PDI(Kettle)源码编译8.2.0.0.R版本

2022-11-12 15:57:42 浏览数 (1)

文章目录

  • 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小技巧
    • 总结

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的源码编译,有问题的读者,可以留言,看到如果可以复现的话,我会及时回复的。

0 人点赞