MacOS Kettle 9.1 环境搭建
一、软件版本
-
MacOS:Big Sur 11.4 Core i7
-
Java:1.8_301
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
-
Kettle:9.1
https://sourceforge.net/projects/pentaho/files/Data%20Integration/
-
swt:4.21M1
https://download.eclipse.org/eclipse/downloads/drops4/S-4.21M1-202107090030/
二、安装步骤
1、安装Java
下好jdk的dmg包以后,傻瓜式安装
2、配置Java环境
以zsh为例,在 .zshrc 文件添加以下配置,同时刷新zsh配置
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home
export PATH=$JAVA_HOME/bin:$PATH:.
export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:.
在控制台中输入java -version,看到以下信息则配置完成
$ java -version
java version "1.8.0_301"
Java(TM) SE Runtime Environment (build 1.8.0_301-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.301-b09, mixed mode)
3、解压Kettle文件
将Kettle压缩包解压到目录
4、启动Kettle
-
点击目录下的Data Integration.app启动
需要解决权限问题,在控制台输入以下命令
sudo xattr -dr com.apple.quarantine /**/data-integration/Data Integration.app
-
在控制台中使用 sh spoon.sh 启动
sh spoon.sh
三、启动失败问题
-
org.eclipse.swt.widgets.Control.internal_new_GC
2021/07/27 18:42:14 - Spoon - ERROR (version 9.1.0.0-324, build 9.1.0.0-324 from 2020-09-07 05.09.05 by buildguy) : 一个未预期的错误发生在Spoon: probable cause:在停止Spoon前,请先关闭其它spoon窗口! 2021/07/27 18:42:14 - Spoon - null 2021/07/27 18:42:14 - Spoon - ERROR (version 9.1.0.0-324, build 9.1.0.0-324 from 2020-09-07 05.09.05 by buildguy) : java.lang.NullPointerException 2021/07/27 18:42:14 - Spoon - at org.eclipse.swt.widgets.Control.internal_new_GC(Control.java:2180) 2021/07/27 18:42:14 - Spoon - at org.eclipse.swt.graphics.GC.<init>(GC.java:177) 2021/07/27 18:42:14 - Spoon - at org.eclipse.swt.graphics.GC.<init>(GC.java:138) 2021/07/27 18:42:14 - Spoon - at org.eclipse.swt.custom.CTabFolder.updateTabHeight(CTabFolder.java:3806) 2021/07/27 18:42:14 - Spoon - at org.eclipse.swt.custom.CTabFolder.runUpdate(CTabFolder.java:3839) 2021/07/27 18:42:14 - Spoon - at org.eclipse.swt.custom.CTabItem.getBounds(CTabItem.java:156) 2021/07/27 18:42:14 - Spoon - at org.eclipse.swt.custom.CTabFolder.onPaint(CTabFolder.java:2076) 2021/07/27 18:42:14 - Spoon - at org.eclipse.swt.custom.CTabFolder.lambda$init$0(CTabFolder.java:337) 2021/07/27 18:42:14 - Spoon - at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89) 2021/07/27 18:42:14 - Spoon - at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4319) 2021/07/27 18:42:14 - Spoon - at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1512) 2021/07/27 18:42:14 - Spoon - at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1535) 2021/07/27 18:42:14 - Spoon - at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1520) 2021/07/27 18:42:14 - Spoon - at org.eclipse.swt.widgets.Control.drawWidget(Control.java:1279) 2021/07/27 18:42:14 - Spoon - at org.eclipse.swt.widgets.Widget.drawRect(Widget.java:776) 2021/07/27 18:42:14 - Spoon - at org.eclipse.swt.widgets.Display.windowProc(Display.java:5956) 2021/07/27 18:42:14 - Spoon - at org.eclipse.swt.internal.cocoa.OS.objc_msgSendSuper(Native Method) 2021/07/27 18:42:14 - Spoon - at org.eclipse.swt.widgets.Display.applicationNextEventMatchingMask(Display.java:5210) 2021/07/27 18:42:14 - Spoon - at org.eclipse.swt.widgets.Display.applicationProc(Display.java:5634) 2021/07/27 18:42:14 - Spoon - at org.eclipse.swt.internal.cocoa.OS.objc_msgSend(Native Method) 2021/07/27 18:42:14 - Spoon - at org.eclipse.swt.internal.cocoa.NSApplication.nextEventMatchingMask(NSApplication.java:97) 2021/07/27 18:42:14 - Spoon - at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3754) 2021/07/27 18:42:14 - Spoon - at org.pentaho.di.ui.spoon.Spoon.readAndDispatch(Spoon.java:1405) 2021/07/27 18:42:14 - Spoon - at org.pentaho.di.ui.spoon.Spoon.waitForDispose(Spoon.java:7989) 2021/07/27 18:42:14 - Spoon - at org.pentaho.di.ui.spoon.Spoon.start(Spoon.java:9371) 2021/07/27 18:42:14 - Spoon - at org.pentaho.di.ui.spoon.Spoon.main(Spoon.java:711) 2021/07/27 18:42:14 - Spoon - at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 2021/07/27 18:42:14 - Spoon - at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 2021/07/27 18:42:14 - Spoon - at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 2021/07/27 18:42:14 - Spoon - at java.lang.reflect.Method.invoke(Method.java:498) 2021/07/27 18:42:14 - Spoon - at org.pentaho.commons.launcher.Launcher.main(Launcher.java:92) java.lang.NullPointerException at org.eclipse.swt.widgets.Control.internal_new_GC(Control.java:2180) at org.eclipse.swt.graphics.GC.<init>(GC.java:177) at org.eclipse.swt.graphics.GC.<init>(GC.java:138) at org.eclipse.swt.custom.CTabFolder.updateTabHeight(CTabFolder.java:3806) at org.eclipse.swt.custom.CTabFolder.runUpdate(CTabFolder.java:3839) at org.eclipse.swt.custom.CTabItem.getBounds(CTabItem.java:156) at org.eclipse.swt.custom.CTabFolder.onPaint(CTabFolder.java:2076) at org.eclipse.swt.custom.CTabFolder.lambda$init$0(CTabFolder.java:337) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89) at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4319) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1512) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1535) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1520) at org.eclipse.swt.widgets.Control.drawWidget(Control.java:1279) at org.eclipse.swt.widgets.Widget.drawRect(Widget.java:776) at org.eclipse.swt.widgets.Display.windowProc(Display.java:5956) at org.eclipse.swt.internal.cocoa.OS.objc_msgSendSuper(Native Method) at org.eclipse.swt.widgets.Display.applicationNextEventMatchingMask(Display.java:5210) at org.eclipse.swt.widgets.Display.applicationProc(Display.java:5634) at org.eclipse.swt.internal.cocoa.OS.objc_msgSend(Native Method) at org.eclipse.swt.internal.cocoa.NSApplication.nextEventMatchingMask(NSApplication.java:97) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3754) at org.pentaho.di.ui.spoon.Spoon.readAndDispatch(Spoon.java:1405) at org.pentaho.di.ui.spoon.Spoon.waitForDispose(Spoon.java:7989) at org.pentaho.di.ui.spoon.Spoon.start(Spoon.java:9371) at org.pentaho.di.ui.spoon.Spoon.main(Spoon.java:711) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.pentaho.commons.launcher.Launcher.main(Launcher.java:92)
出现这种情况,需要手动下载替换swt的jar包
将下好的包解压,可看到以下的目录
然后将swt.jar替换到/data-integration/libswt/osx64目录下,即可启动Kettle
同时可以对比下包,找下原因
swt 4.21M1的代码
9.1的原始swt.jar包中的代码
原代码在取得graphicsContext时未做判空处理,graphicsContext.graphicsPort() 时导致运行报错在后续版本中已修复
-
打开DB连接时报错
在解决完swt的版本问题后,在使用过程中发现,打开DB连接,或者查询表时会出现以下错误
org.pentaho.ui.xul.XulException: org.pentaho.ui.xul.XulException: java.lang.reflect.InvocationTargetException at org.pentaho.ui.xul.impl.AbstractXulLoader.loadXul(AbstractXulLoader.java:135) at org.pentaho.ui.xul.swt.SwtXulLoader.loadXul(SwtXulLoader.java:128) at org.pentaho.ui.xul.swt.SwtXulLoader.loadXul(SwtXulLoader.java:122) at org.pentaho.ui.xul.impl.AbstractXulLoader.loadXul(AbstractXulLoader.java:243) at org.pentaho.ui.database.DatabaseConnectionDialog.getSwtInstance(DatabaseConnectionDialog.java:60) at org.pentaho.di.ui.core.database.dialog.XulDatabaseDialog.createDialog(XulDatabaseDialog.java:163) at org.pentaho.di.ui.core.database.dialog.XulDatabaseDialog.open(XulDatabaseDialog.java:115) at org.pentaho.di.ui.core.database.dialog.DatabaseDialog.open(DatabaseDialog.java:61) at org.pentaho.di.ui.spoon.delegates.SpoonDBDelegate.editConnection(SpoonDBDelegate.java:96) at org.pentaho.di.ui.spoon.Spoon.doubleClickedInTree(Spoon.java:3160) at org.pentaho.di.ui.spoon.Spoon.doubleClickedInTree(Spoon.java:3095) at org.pentaho.di.ui.spoon.Spoon.access$1700(Spoon.java:373) at org.pentaho.di.ui.spoon.Spoon$26.widgetDefaultSelected(Spoon.java:6375) at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:123) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89) at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4478) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1522) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1545) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1530) at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:1324) at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4264) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3837) at org.pentaho.di.ui.spoon.Spoon.readAndDispatch(Spoon.java:1405) at org.pentaho.di.ui.spoon.Spoon.waitForDispose(Spoon.java:7989) at org.pentaho.di.ui.spoon.Spoon.start(Spoon.java:9371) at org.pentaho.di.ui.spoon.Spoon.main(Spoon.java:711) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.pentaho.commons.launcher.Launcher.main(Launcher.java:92) Caused by: org.pentaho.ui.xul.XulException: java.lang.reflect.InvocationTargetException at org.pentaho.ui.xul.impl.XulParser.getElement(XulParser.java:239) at org.pentaho.ui.xul.impl.XulParser.parse(XulParser.java:164) at org.pentaho.ui.xul.impl.XulParser.parse(XulParser.java:171) at org.pentaho.ui.xul.impl.XulParser.parse(XulParser.java:171) at org.pentaho.ui.xul.impl.XulParser.parse(XulParser.java:171) at org.pentaho.ui.xul.impl.XulParser.parseDocument(XulParser.java:85) at org.pentaho.ui.xul.impl.AbstractXulLoader.loadXul(AbstractXulLoader.java:127) ... 30 more Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at org.pentaho.ui.xul.impl.XulParser.getElement(XulParser.java:227) ... 36 more Caused by: java.lang.NoClassDefFoundError: org/eclipse/swt/custom/TableTreeItem at org.eclipse.jface.util.OpenStrategy.initializeHandler(OpenStrategy.java:269) at org.eclipse.jface.util.OpenStrategy.<init>(OpenStrategy.java:107) at org.eclipse.jface.viewers.StructuredViewer.hookControl(StructuredViewer.java:1161) at org.eclipse.jface.viewers.ListViewer.<init>(ListViewer.java:79) at org.eclipse.jface.viewers.ListViewer.<init>(ListViewer.java:67) at org.pentaho.ui.xul.swt.tags.SwtListbox.<init>(SwtListbox.java:90) ... 41 more Caused by: java.lang.ClassNotFoundException: org.eclipse.swt.custom.TableTreeItem at java.net.URLClassLoader.findClass(URLClassLoader.java:382) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ... 47 more
可以看到最下方错误:找不到类 org.eclipse.swt.custom.TableTreeItem
同样可以通过翻源码来解决
查看4.21M1版本源码路径下的文件,发现已经没有这个类了
继续翻看swt的文档,在Deprecated API removals中发现,4.12版本时被移除
于是下了4.11版本的jar包替换尝试,发现graphicsContext的判空问题未被修复
但是我们可以把4.11版本内未被移除的TableTreeItem放入4.21M1的jar包中将相关的class文件放入jar包,重新替换后,Kettle恢复正常使用
四、数据连接问题
-
数据库驱动缺失
将驱动文件放在/data-integration/lib下
-
连接SAP
将sapjco3.jar放在/data-integration/lib下
可以参考这篇文章:https://www.cnblogs.com/rinack/p/6866191.html