經過查看配置類Configration源代碼發現,類加載器會使用當前程序默認的Classloader
public Configuration(boolean loadDefaults) {
this.quietmode = true;
this.allowNullValueProperties = false;
this.resources = new ArrayList();
this.finalParameters = Collections.newSetFromMap(new ConcurrentHashMap());
this.loadDefaults = true;
this.classLoader = Thread.currentThread().getContextClassLoader();
if (this.classLoader == null) {
this.classLoader = Configuration.class.getClassLoader();
}
this.loadDefaults = loadDefaults;
this.updatingResource = new ConcurrentHashMap();
Class var2 = Configuration.class;
synchronized(Configuration.class) {
REGISTRY.put(this, (Object)null);
}
}
而我在kettle開發時使用的是插件形式,加載類時讀取了kettle默認的根目錄,導致無法加載插件的hdfs相關類。
解決方式:初始化定義自己的classloader:
Configuration hdfsConf = new Configuration();
hdfsConf.setClassLoader(this.getClass().getClassLoader());
