java调用kettle自定义kettle.properties配置文件路径
默认路径
java调用kettle的jar包时,在初始化环境的时候,会在指定路径创建并加载kettle的kettle.properties
文件,该文件的默认位置为 ${user.dir}/.kettle/kettle.properties
,在不同的系统上,${user.dir}
的默认位置如下:
系统 | 路径 |
---|---|
Windows | C:\Users\用户\.kettle\kettle.properties |
Macos | /Users/用户名/.kettle/kettle.properties |
Linux | /home/用户名/.kettle/kettle.properties |
但是如果你设置了KETTLE_HOME
这个环境变量,Kettle将会在该路径下查找或创建kettle.properties文件:${KETTLE_HOME}/.kettle/kettle.properties
源码如下:
/**
* Looks up the user's home directory (or KETTLE_HOME) for every invocation. This is no longer a static property so
* the value may be set after this class is loaded.
*
* @return The path to the users home directory, or the System property {@code KETTLE_HOME} if set.
*/
public static String getUserHomeDirectory() {
return NVL( System.getenv( "KETTLE_HOME" ), NVL( System.getProperty( "KETTLE_HOME" ),
System.getProperty( "user.home" ) ) );
}
修改默认路径
直接设置 KETTLE_HOME
即可
public static void initEnvironment() throws IOException, KettleException {
System.setProperty("KETTLE_HOME","/Volumes/DATA/temp/kettle");
KettleEnvironment.init();
String directory = Const.getKettleDirectory();
System.out.println("KETTLE_HOME:"+directory);
}
log输出如下
KETTLE_HOME:/Volumes/DATA/temp/kettle/.kettle
默认加了.kettle
路径
如果不想要.ketttle这个目录,可以参考如下方法:
源码如下
public static String getKettleDirectory() {
return getUserHomeDirectory() + FILE_SEPARATOR + getUserBaseDir();
}
/**
* Determines the Kettle directory in the user's home directory.
*
* @return The Kettle directory.
*/
public static String getUserBaseDir() {
return BasePropertyHandler.getProperty( "userBaseDir", ".kettle" );
}
源码中未找到设置 userBaseDir
的地方,但是可以利用java的反射来修改
public static void initEnvironment() throws IOException, KettleException {
System.setProperty("KETTLE_HOME","/Volumes/DATA/temp");
//反射修改 userBaseDir
BasePropertyHandler instance = BasePropertyHandler.getInstance();
Object instanceHandler = ReflectUtil.invoke(instance, "getInstanceHandler");
java.util.LinkedList<OverlayProperties> propList = (java.util.LinkedList<OverlayProperties>) ReflectUtil.getFieldValue(instanceHandler, "propList");
OverlayProperties overlayProperties = new OverlayProperties("");
overlayProperties.setProperty("userBaseDir","kettle");
propList.add(overlayProperties);
//环境初始化
KettleEnvironment.init();
String directory = Const.getKettleDirectory();
System.out.println("directory:"+directory);
// 获取配置参数
String params = EnvUtil.getSystemProperty("KETTLE_LAZY_REPOSITORY");
System.out.println("params:"+params);
}
日志输出如下
directory:/Volumes/DATA/temp/kettle
params:false