2009-07-03 7 views
0

Je suis exécuter le binaire java d'un de mes cours, et un ClassNotFoundException est jeté:Je ne comprends pas pourquoi ce ClassNotFoundException est jeté


Results of executing:/usr/bin/java -classpath "/home/geo" Geoline 
Error stream: 
Exception in thread "main" java.lang.NoClassDefFoundError: Geoline 
Caused by: java.lang.ClassNotFoundException: Geoline 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:217) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:205) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:323) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:268) 
     at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:336) 
Could not find the main class: Geoline. Program will exit. 
Output stream: 

La classe Geoline est situé dans/home/geo/Geoline.java. La chose est, peu importe où dans le système de fichiers je suis situé, si j'exécute la même commande manuellement, la classe est exécutée. Pourquoi la même chose ne se passe-t-elle pas lorsque le binaire est exécuté avec Runtime.getRuntime(). Exec?

modifier: est ici la sortie générée avec le drapeau verbeux: pastie link modifier: est ici le contenu du fichier:


public class Geoline { 
    public static void main(String[] args) { 
     System.out.println("blabla"); 
    } 
} 
+0

Pourquoi citez-vous le fichier .java? Je déteste poser une question "stupide", mais l'avez-vous compilé dans un fichier .class? Et est le répertoire où le chemin /home/geo/Geoline.class vit dans le CLASSPATH? – duffymo

+0

Oui, c'est compilé. La compilation a lieu avant l'action d'exécution. Le chemin -class "/ home/geo" ne le charge-t-il pas dans le CLASSPATH? – Geo

+0

Est-ce que la classe a un paquet? Si oui, c'est le répertoire où réside la racine du paquet qui doit être dans CLASSPATH. Si non, ajoutez-en un. Les classes sans package sont triviales. – duffymo

Répondre

4

Il est assez difficile de dire ce qui se passe parce que vous didn ne publiez pas le code.

Cependant, c'est ma supposition la plus éclairée.

Vous essayez d'exécuter l'ensemble de la commande en Java String et l'interpréteur Java ne les reconnaît pas comme des arguments différents.

Essayez de les emballer tous dans un String []

Ainsi, au lieu de

Runtime.getRuntime().execute("/usr/bin/java -classpath \"/home/geo\" Geoline"); 

Essayez avec:

Runtime.getRuntime().execute(new String[]{ 
       "/usr/bin/java","-classpath","/home/geo","Geoline" 
}); 

Ou, vous pouvez publier votre code réel et nous pouvons voir ce qui se passe.

EDIT

C'est ma tentative. Je crée la RunIt.java classe qui est essentiellement Runtime.exec comme je l'ai suggéré et Hello.java qui assez dit beaucoup Bonjour + args [0]

Voici le ouput:

$cat RunIt.java 
import java.io.*; 

public class RunIt{ 
    public static void main(String [] args) throws IOException { 
     Process p = Runtime.getRuntime().exec( args); 
     BufferedReader reader = new BufferedReader(new InputStreamReader (p.getInputStream())); 
     String line = null; 

     while((line = reader.readLine()) != null) { 
      System.out.println(line); 
     } 
     reader.close(); 
    } 
} 
$cat Hello.java 
public class Hello { 
    public static void main(String [] args) { 
     System.out.println("Hola: " + (args.length > 0 ? args[0] : " a nadie")); 
    } 
} 
$javac RunIt.java 
$java RunIt javac Hello.java 
$java RunIt java Hello Mundo 
Hola: Mundo 
$ 
+0

Cela a fonctionné! Merci Oscar! Merci duffymo aussi! – Geo

1

vous pourriez avoir besoin de lire ceci: When Runtime.exec() won't

+0

Qu'y a-t-il avec cet article? Je n'ai jamais envie de le lire, mais il date de l'an 2000. Peut-être que les choses ont déjà été corrigées. Dans Java1.5, une nouvelle classe a été ajoutée au JRE: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ProcessBuilder.html Je ne sais pas si c'était à réparer quel que soit cet article. Avez-vous un résumé? – OscarRyz

+0

Vous indique les pièges lors de l'utilisation de Runtime.exec(). Millésime 2000, mais ça vaut quand même le coup car le Runtime n'a pas changé depuis. – duffymo

1

ne sais pas ce que votre système est, mais Runtime.exec est pas la même chose comme une coquille: essayez sans "autour e e classpath

/usr/bin/java -classpath /home/geo Geoline 

(ou utiliser l'exécutif avec l'argument de tableau)
et je suppose que votre fichier de classe est/home/géo/Geoline. classe

EDIT: de même si vous essayez d'utiliser la redirection de la sortie standard "dosomething> somefile"
Runtime.exec ne reconnaît pas cela aussi

[]]

Questions connexes