经过查看配置类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());