繁体   English   中英

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

[英]Can I invoke a main method passing jvm parameter?

我的目的是要调试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调用的主要方法

否,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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM