Проблема с аргументами при запуске банку с использованием отражения
Я пытаюсь запустить jar, используя отражение с помощью метода getMethod и invoke, но столкнулся с проблемами с аргументами, передаваемыми методу 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
Как вы можете видеть из трассировки стека, он пытается получить доступ к файлу "param.xml" из папки "/ home / user /./config".
Очевидно, что если бы между '/ home / user /' и './config' не было места, все было бы хорошо.
Меня смущает тот факт, что я жестко закодировал аргументы в аргументах String[], а второй - "-c ./config/param.xml", и он выглядит как каталог, из которого запускается приложение, т.е. / home / user /, объединяется с./config/, но с пробелом между ними
Есть идеи, что происходит?
Дэвид
3 ответа
Может быть, если мы посмотрим на ваш main
метод, и, в частности, способ управления аргументами, мы могли бы помочь вам лучше...
Обратите внимание, что когда вы запускаете свой основной класс с помощью команды java ... -a -c ./config/param.xml
тогда у вас есть 3 аргумента в вашем main(String[] args)
метод:
public static void main(String[] args) {
for (String s : args) {
System.out.println("-> '" + s + "'");
}
...
будет отображать:
-> '-a'
-> '-c'
-> './config/param.xml'
-c
а также ./config/param.xml
должны быть в отдельных элементах массива.
String[] args = new String[3];
args[0] = "-a";
args[1] = "-c";
args[2] = "./config/param.xml"
Но, пожалуйста, предоставьте код, который вызывает исключение.