2010-02-03 30 views
0

je tente de lancer un pot en utilisant la réflexion avec le la getMethod et invoquer la méthode, mais a couru en difficulté avec les arguments passés à la méthode Invoke:avec des arguments lors de l'exécution d'un pot en utilisant la réflexion

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); 

et je reçois cette erreur:

[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 

Comme vous pouvez le voir sur la stacktrace, il tente d'accéder au fichier « param.xml » du dossier '/ home/user/./config.

De toute évidence, si l'espace entre '/ home/user /' et './config' n'était pas là, tout irait bien. Je suis confus avec le fait que j'ai codé en dur les arguments dans String [] args et le second est "-c ./config/param.xml" et il ressemble au répertoire à partir duquel l'application est en cours d'exécution, ie/home/user /, est concaténé avec ./config/ mais avec un espace entre?

Une idée de ce qui se passe?

David

+1

Sans voir à quoi ressemble 'DioscuriFrame', il n'y a aucun moyen de savoir – skaffman

Répondre

1

Peut-être que si nous avons un oeil à votre méthode main, et en particulier la façon dont les arguments sont gérés, nous pourrions vous aider à une meilleure façon ...

Notez que lorsque vous exécutez votre classe principale avec la commande java ... -a -c ./config/param.xml, vous avez 3 arguments dans votre méthode main(String[] args):

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

afficherons:

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

en effet, comme d'autres réponses le suggèrent! stupide que je suis. Merci les gars – dm76

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

Mais s'il vous plaît fournir le code qui fait l'exception.

1

Les -c et ./config/param.xml doivent être dans des éléments de tableau séparés.