我尝试使用带有 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/ 连接,但在 ?? 之间有一个空格?
知道发生了什么吗?
大卫