背景介绍

由于系统需要从sql server 远程数据库抓取数据存储到当前数据库(mysql)中,所以采用了kettle来进行数据抽取。使用spoon图形化工具进行ktr文件的编写。测试通过后,想集成进项目中,然而遇到以下问题:

  • 首先,kettle的jar包引入,在一些共有的maven库中找不到相关jar包。所以从spoon客户端中,拷贝出jar包,然后加入本地maven库。主要包括kettle-core、kettle-engine、metastore、commons-vfs2、commons-lang。
mvn install:install-file -DgroupId=pentaho-kettle
-DartifactId=kettle-core
-Dversion=7.1.0.0-12
-Dpackaging=jar -Dfile=pentaho-kettle.jar
  • 其次,将项目部署到linux服务器后,发现kettle读不到ktr文件,查看堆栈信息,发现路径正常。
org.pentaho.di.core.exception.KettleXMLException:
Unable to read file [file:///pws.jar!/BOOT-INF/classes!/kettle/userInfo.ktr]
Could not read from "file:///pws.jar!/BOOT-INF/classes!/kettle/userInfo.ktr" because it is a not a file.at org.pentaho.di.core.xml.XMLHandler.loadXMLFile(XMLHandler.java:561)at org.pentaho.di.core.xml.XMLHandler.loadXMLFile(XMLHandler.java:540)at org.pentaho.di.trans.TransMeta.<init>(TransMeta.java:2742)at org.pentaho.di.trans.TransMeta.<init>(TransMeta.java:2710)at org.pentaho.di.trans.TransMeta.<init>(TransMeta.java:2687)at org.pentaho.di.trans.TransMeta.<init>(TransMeta.java:2667)at org.pentaho.di.trans.TransMeta.<init>(TransMeta.java:2632)at org.pentaho.di.trans.TransMeta.<init>(TransMeta.java:2595)at cn.pioneer.pws.service.impl.KettleServiceImpl.synchronizationInfo(KettleServiceImpl.java:50)at cn.pioneer.pws.service.impl.KettleServiceImpl.synchroUserData(KettleServiceImpl.java:29)at cn.pioneer.pws.controller.KettleController.synchroUserData(KettleController.java:21)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.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209)at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:877)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:783)at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974)at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:877)at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851)at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:96)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at cn.pioneer.pws.util.PageFilter.doFilter(PageFilter.java:46)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790)at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1468)at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run(Thread.java:748)
Caused by: org.apache.commons.vfs2.FileNotFoundException: Could not read from "file:///pws.jar!/BOOT-INF/classes!/kettle/userInfo.ktr" because it is a not a file.at org.apache.commons.vfs2.provider.AbstractFileObject.getInputStream(AbstractFileObject.java:1315)at org.apache.commons.vfs2.provider.DefaultFileContent.getInputStream(DefaultFileContent.java:396)at org.pentaho.di.core.vfs.KettleVFS.getInputStream(KettleVFS.java:267)at org.pentaho.di.core.xml.XMLHandler.loadXMLFile(XMLHandler.java:559)... 62 common frames omitted
Caused by: java.io.FileNotFoundException: /pws.jar!/BOOT-INF/classes!/kettle/userInfo.ktr (No such file or directory)at java.io.FileInputStream.open0(Native Method)at java.io.FileInputStream.open(FileInputStream.java:195)at java.io.FileInputStream.<init>(FileInputStream.java:138)at org.apache.commons.vfs2.provider.local.LocalFile.doGetInputStream(LocalFile.java:209)at org.apache.commons.vfs2.provider.AbstractFileObject.getInputStream(AbstractFileObject.java:1307)... 65 common frames omitted

问题分析

  • 首先,由于在idea中项目能够正常运行,但在服务器上面运行失败。第一反应是window与linux的差异造成的。然后在本机以java -jar xxx 方式运行,同样报错。
         String filePath =  this.getClass().getClassLoader().getResource("kettle/userInfo.ktr").getPath();KettleEnvironment.init();TransMeta transMeta = new TransMeta(filePath);Trans trans = new Trans(transMeta);if (!StringUtils.isNullOrEmpty(department)){trans.setVariable("department", department);}trans.execute(null); // You can pass arguments instead of null.trans.waitUntilFinished();

其中,String filePath = this.getClass().getClassLoader().getResource("kettle/userInfo.ktr").getPath();获取资源文件ktr的路径。
TransMeta transMeta = new TransMeta(filePath);将路径传递给kettle内库中的处理类,进行ktr文件的解析及执行。
而问题在于以java -jar 方式运行程序时,由于项目没有解压,程序不能访问未解压的资源文件

解决方案

  • 将字符串的路径参数改成流(InputStream)。查看kettle原代码发现, TransMeta transMeta = new TransMeta(filePath);内部连续多次调用其他带参数方法,且新增参数都为null,即参数可以忽略。
     InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("/kettle/userInfo.ktr");KettleEnvironment.init();TransMeta transMeta = new TransMeta(inputStream, null, true, null,null);Trans trans = new Trans(transMeta);if (!StringUtils.isNullOrEmpty(department)){trans.setVariable("department", department);}trans.execute(null); // You can pass arguments instead of null.trans.waitUntilFinished();

springboot集成kettle, 访问不到ktr文件相关推荐

  1. springBoot集成kettle,用到json,初始化插件失败【kettle-json-plugin-core-9.3.0.0-428.jar】

    // 初始化 KETTLE_JSON_PLUGIN 插件在kettle目录下/plugins的路径 StepPluginType.getInstance().getPluginFolders().ad ...

  2. springBoot集成swagger访问报404

    集成步骤: 1). 导入knife4j的maven坐标 <dependency>         <groupId>com.github.xiaoymin</groupI ...

  3. SpringBoot集成阿里云OSS上传文件

    文章目录 前言 一.准备环境 1.在搜索框搜索 对象存储OSS 2.创建Bucket 3.找到开发相关信息 二.具体代码 1.Maven依赖 2.application.yml配置 3.AliOssP ...

  4. Java技术:SpringBoot集成FreeMarker生成word文件

                    今天给大家分享SpringBoot集成FreeMarker模板引擎生成word文件的用法,感兴趣的可以学一下,完整源码地址在文章末尾处,欢迎互相沟通交流! 一.什么是F ...

  5. 第 5 课 SpringBoot集成Mybatis(2)-配置文件版

    第五课 SpringBoot集成Mybatis(2)-配置文件版 文章目录 第五课 SpringBoot集成Mybatis(2)-配置文件版 1. 引入依赖:pom.xml 2. 配置applicat ...

  6. 第 6 讲 SpringBoot集成Cros解决跨域问题

    第六讲 SpringBoot集成Cros解决跨域问题 文章目录 第六讲 SpringBoot集成Cros解决跨域问题 1.开发RestFul类型接口 1.1 配置pom.xml,引入依赖 1.2 ap ...

  7. springboot集成阿里OSS上传文件

    开发前的准备: 自己在阿里云上申请免费的Oss对象存储,新建Bucket---读写权限选择公共读,我开始这里忘了导致后来踩了小坑 接下来是代码中的一些配置:我用的是springboot 1>添加 ...

  8. springboot 静态资源访问,和文件上传 ,以及路径问题

    springboot 静态资源访问: 这是springboot 默认的静态资源访问路径  访问顺序依次从前到后(http://localhost:8080/bb.jpg) spring.resourc ...

  9. Kettle【实践 01】Linux环境下使用Azkaban定时调用Kettle的KJB或KTR脚本实现自动化数据处理(完整流程实例分享:包含sql+ktr+shell+flow相关文件云资源)

    资源链接在文章末尾,包含文件: 1. 说明 Kettle 的 KJB 或 KTR 调用使用的 shell 脚本,小伙伴可能会想,可以用 Linux 的 crontab 进行任务的调度啊,为什么需要 A ...

  10. SpringBoot集成文件 - 如何基于POI-tl和word模板导出庞大的Word文件?

    前文我们介绍了通过Apache POI通过来导出word的例子:那如果是word模板方式,有没有开源库通过模板方式导出word呢?poi-tl是一个基于Apache POI的Word模板引擎,也是一个 ...

最新文章

  1. 备战2022秋季“金三银四”跳槽必备:软件测试面试题,贡献给需要的小伙伴,最后有惊喜哦
  2. 自动化测试|录制回放效果差异检测
  3. 《SLIC Superpixels》阅读笔记
  4. Android 自定义控件一 带圆形进度的按钮 ControlButton2
  5. oracle中如何创建一个过程,如何开发ORACLE存储过程
  6. wemosD1_WIFI模块 与 arduino
  7. 3级软件测试试题,软件测试人员(.NET)_3级_操作技能鉴定1.1.3试题单(26页)-原创力文档...
  8. 如何使用github中的pull request功能?
  9. 重返数学史的黄金时代,由数学推动诞生的人工智能,一部人类智慧形成的历史...
  10. [存档]使用.Net开发web程序时现在比较流行的前台技术都有什么?
  11. Android7.1启动系统App必须配置加密
  12. scikit-learn学习笔记
  13. SQL面试经典题(含答案)
  14. Java程序员简历模板
  15. 3.2常用的调度算法
  16. Qt小游戏开发:俄罗斯方块
  17. 微信小程序毕业设计 基于微信会议室预约小程序系统开题报告
  18. 三、GAMIT解算之分步处理
  19. dell自带的测试软件,自带校色仪!戴尔万元显示器上手:告诉你什么叫专业
  20. 红外发光二极管的接收方式

热门文章

  1. 《富爸爸穷爸爸》阅读笔记
  2. vue中使用天气插件(和风天气)
  3. # 汉洛塔问题的解决思路及其代码
  4. PuTTY key format too new怎么解决?
  5. 400 : perceived to be a client error 错误
  6. SSM遇到的表单问题:The server cannot or will not process the request due to something that is perceived to b
  7. 【老生谈算法】matlab实现MF-TDMA系统中多用户多业务的无线接入控制和时隙分配算法源码——时隙分配算法
  8. 探探这只反语言暴力公益短片 提供了一个新视角
  9. vmware虚拟服务器数据备份,爱数VMware虚拟化平台备份恢复方案.pdf
  10. 欧拉降幂公式模板hdu4704