Я работаю над той же проблемой. У меня есть программа (назовем ее Driver), которая должна реализовывать следующий метод:
public void runJar(File jar, String mainClass, File inputDir, File outputDir);
Чтобы сделать это, я звонил org.apache.hadoop.util.RunJar.main(String[])
, это то, что вызывает ваша командная строка. Это прекрасно работает только если вы запускаете драйвер из командной строки .
Если драйвер работает внутри контейнера (например, Tomcat или Jetty), у вас возникнет проблема. Вы получите ошибки типа
java.lang.ClassNotFoundException: org.apache.hadoop.fs.Path
Это из-за того, как RunJar
портится с загрузчиками классов. Вам необходимо вручную создать загрузчик классов, например:
final ClassLoader original = Thread.currentThread().getContextClassLoader();
try {
URL[] urls = new URL[] { jar.toURI().toURL() };
ClassLoader loader = new URLClassLoader(urls, originalLoader);
Thread.currentThread().setContextClassLoader(loader);
Class<?> mainClass = Class.forName(driverClass, true, loader);
Class[] argTypes = new Class[]{ Array.newInstance(String.class, 0).getClass()};
Method main = mainClass.getMethod("main", argTypes);
main.invoke(null, new Object[] { args });
} finally {
Thread.currentThread().setContextClassLoader(original);
}