【问题标题】:problem with arguments when running a jar using reflection使用反射运行 jar 时的参数问题
【发布时间】:2011-01-12 17:26:00
【问题描述】:

我尝试通过 getMethod 和 invoke 方法使用反射运行一个 jar,但在传递给 invoke 方法的参数时遇到了问题:

String mainClass = myprog.Run;
String[] args = new String[2];
args[0] = "-a";
args[1] = "-c ./config/param.xml"

ClassLoader classLoader = createClassLoader(getClassPath());

// Invoke the method
setContextClassLoader(classLoader);
Class<?> theClass = classLoader.loadClass(mainClass);

theClass.getMethod("main", String[].class).invoke(null, (Object) args);

我得到这个错误:

 [java] java.lang.reflect.InvocationTargetException
 [java]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 [java]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 [java]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 [java]     at java.lang.reflect.Method.invoke(Method.java:597)
 [java]     at eu.keep.util.JarRunner.run(Unknown Source)
 [java] Caused by: java.lang.RuntimeException: config file 'param.xml' does not exist in folder '/home/user/ ./config'
 [java]     at dioscuri.DioscuriFrame.<init>(Unknown Source)
 [java]     at dioscuri.DioscuriFrame.main(Unknown Source)
 [java]     ... 5 more

从堆栈跟踪中可以看出,它正在尝试从文件夹“/home/user/./config”访问文件“param.xml”。

显然,如果 '/home/user/' 和 './config' 之间没有空格,那一切都会好起来的。

我对将参数硬编码到 String[] args 而第二个是“-c ./config/param.xml”这一事实感到困惑,它看起来像是运行应用程序的目录,即/home/user/,与 ./config/ 连接,但在 ?? 之间有一个空格?

知道发生了什么吗?

大卫

【问题讨论】:

  • 看不到DioscuriFrame的样子,我们无法知道

标签: java reflection invoke getmethod


【解决方案1】:

也许如果我们看看您的 main 方法,特别是管理参数的方式,我们可以以更好的方式帮助您...

请注意,当您使用命令 java ... -a -c ./config/param.xml 运行主类时,您的 main(String[] args) 方法中有 3 个参数:

public static void main(String[] args) {
    for (String s : args) {
        System.out.println("-> '" + s + "'");
    }
    ...

将显示:

-> '-a'
-> '-c'
-> './config/param.xml'

【讨论】:

  • 确实,就像其他答案所暗示的那样!愚蠢的我。谢谢大家
【解决方案2】:
String[] args = new String[3];
args[0] = "-a";
args[1] = "-c";
args[2] = "./config/param.xml"

但请提供导致异常的代码。

【讨论】:

    【解决方案3】:

    -c./config/param.xml 需要位于不同的数组元素中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      相关资源
      最近更新 更多