背景
最近项目上需要java调用kettle实现ETL逻辑,所以找度娘看了看kettle相关的知识,刚开始写了个demo项目,见参考文档。在demo上能正常调用ktr文件,所以就转移到了项目中,结果发现项目中使用的是8.0.13的mysql驱动包,而kettle默认使用5.x版本的,网上的都是kettle如何配置使用8.0版本的mysql驱动,没有java调用如何配置的,所以这里写下。
实现
在Kettle设置数据库连接时,不选择MySQL,而选择Generic database的连接类型,如下:
该连接类型为自定义数据库URL,一看便知,此时和Java定义数据连接时几乎一致,所以填写自定义连接URL,自定义驱动名称即可,这里需要注意的是,8.0+版本的MySQL在连接时需要指定时区,这是上述两个版本的连接url不一致的原因,而class类文件的路径也略有不同,稍作注意即可。
使用自定义连接,终于在使用8.0+jar包的同时,正确连接到了数据库。
效果
-
使用这种方式能看的ktr文件里的数据库链接方式发生了改变
-
此时通过java调用ktr就没有问题了
附录
- kettle需要的jar如下:
<dependencies>
<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>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/net.sourceforge.jexcelapi/jxl -->
<dependency>
<groupId>net.sourceforge.jexcelapi</groupId>
<artifactId>jxl</artifactId>
<version>2.6.12</version>
</dependency>
<!-- <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
<!--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>
</dependencies>
- 代码:
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.exception.KettleXMLException;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransMeta;
/**
* @author lang
* @date 2020/3/17 17:12
*/
public class Main {
public static void main(String[] args) {
String jobname = "G:\\kettle\\SAP_OOB_UPLOAD.ktr";
Main.runTrans(jobname);
}
public static void runTrans(String filename) {
try {
KettleEnvironment.init();
TransMeta transMeta = new TransMeta(filename);
Trans trans = new Trans(transMeta);
trans.setParameterValue("month_id", "202003");
trans.prepareExecution(null);
trans.startThreads();
//等待执行完毕
trans.waitUntilFinished();
if (trans.getErrors() != 0) {
System.out.println("Error");
}
} catch (KettleXMLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (KettleException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
参考文档
搭建demo:
https://blog.csdn.net/lovePaul77/article/details/89740087
解决java调用kettle使用8.0.x驱动的启发路径 :
https://www.jianshu.com/p/613dbbd8b577