springboot整合kettle实现数据处理
- 导入jar包
- pom.xml配置
- KettleController.java配置
- 报错解决
- 缺少jar包
- org.mozilla.javascript.JavaScriptException
- org.apache.commons.codec.binary.Base64
- org.scannotation.AnnotationDB
- org/apache/log4j/Logger
- 代码报错
- Can't run transformation due to plugin missing
- 运行调试
- 项目源码
本人也是跟着其他人的教程, 摸索着在实现这个功能, 在此记录一下实现过程中遇到的坑
导入jar包
首先这里需要导入三个jar包, 在kettle的安装路径下的lib文件夹中有, 拿到指定位置然后通过maven生成本地jar包即可
mvn install:install-file -Dfile=src/main/resources/lib/kettle-core-8.2.0.0-342.jar -DgroupId=pentaho-kettle -DartifactId=kettle-core -Dversion=8.2.0.0-342 -Dpackaging=jar
mvn install:install-file -Dfile=src/main/resources/lib/kettle-engine-8.2.0.0-342.jar -DgroupId=pentaho-kettle -DartifactId=kettle-engine -Dversion=8.2.0.0-342 -Dpackaging=jar
mvn install:install-file -Dfile=src/main/resources/lib/metastore-8.2.0.0-342.jar -DgroupId=pentaho-kettle -DartifactId=metastore -Dversion=8.2.0.0-342 -Dpackaging=jar
这里要注意, 执行命令前先修改成自己对应的路径, 一般是在springboot项目中创建一个文件夹, 然后在dos界面中进入到项目目录中, 执行如上命令
如果自己kettle中的包的版本号不一致, 需要自己对应修改, 这不是一个万能的命令, 需要自己稍加修改的
pom.xml配置
<!-- 集成kettle -->
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-core</artifactId>
<version>8.2.0.0-342</version>
</dependency>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-engine</artifactId>
<version>8.2.0.0-342</version>
</dependency>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>metastore</artifactId>
<version>8.2.0.0-342</version>
</dependency>
<dependency>
<groupId>org.mozilla</groupId>
<artifactId>javascript</artifactId>
<version>1.7.2</version>
</dependency>
<!-- 以上四个需要自己手动添加 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-vfs2</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>27.1-jre</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.5.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.14</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.scannotation/scannotation -->
<dependency>
<groupId>org.scannotation</groupId>
<artifactId>scannotation</artifactId>
<version>1.0.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
如果复制之后报错, 看一下每一个缩进的位置, 是否是正常的tab符或者空格, 有的地方复制代码到编辑器中, 会产生一些不能识别的字符, 不仔细看还以为是空格呢
KettleController.java配置
import java.io.File;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.plugins.PluginFolder;
import org.pentaho.di.core.plugins.StepPluginType;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransMeta;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import cn.hutool.core.io.FileUtil;
@RestController
@RequestMapping("kettle")
public class KettleController {
@RequestMapping("testKettle")
public String testKettle() throws KettleException {
// 可以把文件放到resources目录下面,然后用hutool读取这文件
// File file = FileUtil.file("33.ktr");
// 这是我本地进行测试的,所以我把文件放到了桌面上了,写了根目录
File file = FileUtil.file("C:\\Users\\Administrator\\Desktop\\deskTopFolder\\springboot_kettle.ktr");
String path = file.getPath();
StepPluginType.getInstance().getPluginFolders().add(new PluginFolder(
"E:\\迅雷下载\\pdi-ce-8.2.0.0-342\\data-integration\\plugins\\steps\\pentaho-kafka-producer", false, true));
// 初始化
KettleEnvironment.init();
// 加载文件
TransMeta transMeta = new TransMeta(path);
Trans trans = new Trans(transMeta);
// 放入参数,这里其实可以从数据库中取到
// 如果没有参数,可以把这步忽略
trans.setParameterValue("stade", "2019-04-24");
trans.prepareExecution(null);
trans.startThreads();
// 等待执行完毕
trans.waitUntilFinished();
return "success";
}
}
报错解决
缺少jar包
maven项目缺少jar包, 到maven仓库搜索地址去找就可以了, 搜索地址
org.mozilla.javascript.JavaScriptException
ClassNotFoundException: org.mozilla.javascript.JavaScriptException
缺少javascript包, pom中添加引用, 引用jar包之后, 手动重启一下springboot项目
<!-- https://mvnrepository.com/artifact/org.eclipse.birt.runtime.3_7_1/org.mozilla.javascript -->
<dependency>
<groupId>org.eclipse.birt.runtime.3_7_1</groupId>
<artifactId>org.mozilla.javascript</artifactId>
<version>1.7.2</version>
</dependency>
org.apache.commons.codec.binary.Base64
java.lang.ClassNotFoundException: org.apache.commons.codec.binary.Base64
缺少如下jar包, 引用jar包之后, 手动重启一下springboot项目
<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.14</version>
</dependency>
org.scannotation.AnnotationDB
java.lang.ClassNotFoundException: org.scannotation.AnnotationDB
缺少如下jar包, 引用jar包之后, 手动重启一下springboot项目
<!-- https://mvnrepository.com/artifact/org.scannotation/scannotation -->
<dependency>
<groupId>org.scannotation</groupId>
<artifactId>scannotation</artifactId>
<version>1.0.3</version>
</dependency>
org/apache/log4j/Logger
java.lang.NoClassDefFoundError: org/apache/log4j/Logger
缺少如下jar包, 引用jar包之后, 手动重启一下springboot项目
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
代码报错
Can’t run transformation due to plugin missing
Can't run transformation due to plugin missing
由于在kettle的ktr文件中使用了插件, 而这里没有引入kettle的插件, 导致无法运行
我在ktr中使用了kafka的producer插件, 所以这里需要引入, 注意, 需要在kettle环境初始化之前引入,
也就是在KettleEnvironment.init();
之前引入
StepPluginType.getInstance().getPluginFolders().add(new PluginFolder("E:\\download\\pdi-ce-8.2.0.0-342\\data-integration\\plugins\\steps\\pentaho-kafka-producer", false, true));
运行调试
使用postman发送请求
控制台输出正常
kafka监听正常
项目源码
至此 问题完美解决!