服务器中java项目调用Kettle转换脚本ktr

项目背景

报表导出业务涉及了两个库,所以这就导致了要进行跨库进行查询,在原本的库设计层面,这两个库是完全物理隔绝的,是没办法进行跨表查询的,所以,我就想了个办法来进行数据的迁移,但是组内资金有限,又不可能在申请服务器,引发了我想用基本的 java 代码,写一个 job 定时任务来定时的调用 ktr 文件就可以了

实施过程

一、maven 本地安装 ktr 所需要的 jar 包

ktr 文件如果用编辑器打开的话,是可以看到就是 xml 的文件,所以,它只是个配置文件,其中需要用到好多 jar 包,那么我们需要下载哪些呢,这里我来详细的说明一下

  1. 我们在下载了 Kettle 整个项目的时候,我们可以看到它本地是有目录的,如下图所示,重点强调一下,这个 Kettle 是有 JDK 版本之分的,如果你用的是 1.7 的 JDK,你的服务器就要是 1.7 的 JDK,否则的话容易报数组越界,或者导出的数据会有乱码,简单一句话,你开发用的是 1.7 就用 1.7,你开发用的是 1.8 就用 1.8Kettle 下载地址6a974b9fc5cf423e822d1a93de7d3213.png5ee7b14b9eeb0ad2ebb175cf9afaa939.pngdc3d97f174214a6259d715b3c678e68d.png我们把这三个基本的 jar 包通过 maven 的命令导入到我们的本地 maven 库中,我得做法是把这三个包放到一个文件夹目录下面,这样好些命令,然后通过 IDEA 的 maven 导入到本地1b6dd11de15123bd75f1ba0a38dbe068.png导入的命令如下

mvn install:install-file -Dfile=D:\1\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=D:\1\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=D:\1\metastore-8.2.0.0-342.jar -DgroupId=pentaho-kettle -DartifactId=metastore -Dversion=8.2.0.0-342 -Dpackaging=jar

我是把这三个包复制到了本地的 D 盘中的文件夹 1 当中,如果你想直接用这个命令,就直接按照我的目录格式来,就可以了

二、编写好 ktr 文件,确保本地是可以跑通的在说

将编辑好的 ktr 文件放到本地当中,写一个测试单元来测试这个代码,并且,如果你是跨库的,用到了 mysql 和 Oracle,那么必须要把这两个驱动 jar 包安装到本地,并被引用 引用这三个 mavne 的地址,在 pom 文件中引用这三个 jar 包,

<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>

然后写一个单元测试,代码如下

@Test
    public void test_path() {
//        可以把文件放到resources目录下面,然后用hutool读取这文件
//        File file = FileUtil.file("33.ktr");
//        这是我本地进行测试的,所以我把文件放到了桌面上了,写了根目录
        File file = FileUtil.file("C:\\Users\\Y\\Desktop\\33.ktr");
        String path = file.getPath();
        System.out.println(path);
//        初始化
        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();
    }

这段代码引用了哪些 jar 包呢,如下

import cn.hutool.core.io.FileUtil;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.MapDifference;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransMeta;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;

这些当你复制到文件的时候可能并不知道到底在 maven 中怎么引入这些 jar 包 复制下面的代码到 pom 文件就可以了

<dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-vfs2</artifactId>
            <version>2.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
        <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>

        <!-- https://mvnrepository.com/artifact/commons-lang/commons-lang -->
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>

      <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>4.5.6</version>
        </dependency>

只有把这些 jar 包都引全了,跑的测试单元代码就不会报错了

End

弄这点东西浪费一下午,不过成果还算可以,可以实现跨库的实现了,就是把另一个库的文件实时的迁移到了本地库中,很奈斯


作者:lovePaul77

来源链接:

https://blog.csdn.net/lovePaul77/article/details/89740087

2ba714654273b97fffc8da5ca8df2f1a.png

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值