我可以调用传递jvm参数的main方法吗?

时间:2015-08-03 03:20:06

标签: java hadoop jvm

我的意图是我想调试一些hadoop。 运行hadoop程序的命令是:

bin/hadoop jar path/to/hadoop-mapreduce-examples-2.2.0.jar wordcount /wordcount /output

此命令将调用RunJar.java的main()方法。 我可以通过在hadoop-env.sh中添加这些来将jvm参数传递给RunJar.java的main()方法:

HADOOP_OPTS="$HADOOP_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=9000"

但RunJar.java的main()中的代码是:

ClassLoader loader =
  new URLClassLoader(classPath.toArray(new URL[0]));
Class<?> mainClass = Class.forName(mainClassName, true, loader);
Method main = mainClass.getMethod("main", new Class[] {
  Array.newInstance(String.class, 0).getClass()
});
main.invoke(null, new Object[] { newArgs });

我可以将一些jvm参数(-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8999)传递给此调用方法

main.invoke(null, new Object[] { newArgs });

这样我就可以以远程方式调试RunJar.java调用的main方法

1 个答案:

答案 0 :(得分:0)

不,JVM已经启动。

唯一的方法是通过使用Runtime.getRuntime().exec()ProcessBuilderProcess类启动新的JVM来运行JAR。

这可能会成功,你不需要传递参数,因为你可以实际调用脚本:

Runtime.getRuntime().exec(
        "bin/hadoop jar path/to/hadoop-mapreduce-examples-2.2.0.jar " +
        "wordcount /wordcount /output");