2011-07-11 3 views
2

Je travaille sur une application Java client-serveur destinée à fonctionner sous Mac OS X ainsi que sous Windows et Linux. L'application a plusieurs modules clients différents qui doivent être exécutés à partir d'une application de lancement. J'ai regardé la classe ProcessBuilder, mais je ne semble pas être bon pour moi. J'ai trouvé un fil ici att stackoverflow où un exemple utilisant Ant a été suggéré (here). I mis en œuvre un procédé qui exécute les modules clients:Application Java exécutant une autre application Java utilisant Ant sur Mac OS X

public void launchAnt(ApplicationData applicationData) { 
    Project project = new Project(); 
    project.setBaseDir(new File(System.getProperty("user.dir"))); 
    project.init(); 
    DefaultLogger logger = new DefaultLogger(); 
    project.addBuildListener(logger); 
    logger.setOutputPrintStream(System.out); 
    logger.setErrorPrintStream(System.err); 
    logger.setMessageOutputLevel(Project.MSG_INFO); 
    System.setOut(new PrintStream(new DemuxOutputStream(project, false))); 
    System.setErr(new PrintStream(new DemuxOutputStream(project, true))); 
    project.fireBuildStarted(); 

    System.out.println("ApplicationLauncher.launch(): Running"); 
    Throwable caught = null; 
    try { 
     /** 
     * Create Java task 
     */ 
     Java javaTask = new Java(); 
     javaTask.setTaskName("Run " + applicationData.getApplication().name()); 
     javaTask.setProject(project); 
     javaTask.setFork(false); 
     javaTask.setFailonerror(true); 
     javaTask.setClassname(applicationData.getClassName()); 

     /** 
     * Working directory 
     */ 
     File workdir = new File(System.getProperty("user.dir")); 
     if(workdir.exists()) { 
      javaTask.setDir(workdir); 
     } else { 
      System.out.println("ApplicationLauncher.launch(): ERROR: Unable to set workdir, " + workdir.getAbsolutePath() + " does note exist."); 
     } 

     /** 
     * Classpath 
     */ 
     Path path = new Path(project); 
     Collection<String> classpaths = getClasspath(); 
     for (String classpath : classpaths) { 
      Path currPath = new Path(project, new File(classpath).getAbsolutePath()); 
      path.add(currPath); 
     } 
     System.out.println("ApplicationLauncher.launch(): Classpath: " + path.toString()); 
     javaTask.setClasspath(path); 

     /** 
     * Arguments 
     */ 
     Argument arg = javaTask.createArg(); 
     arg.setValue(applicationData.getArguments()); 

     /** 
     * Initiate and execute 
     */ 
     javaTask.init(); 
     int ret = javaTask.executeJava(); 
     System.out.println("ApplicationLauncher.launch(): Java task return code: " + ret); 
    } catch (BuildException e) { 
     caught = e; 
    } 

    project.log("ApplicationLauncher.launch(): Finished"); 
    project.fireBuildFinished(caught); 
} 

ApplicationData est un objet qui contient des informations à être lancé sur l'application. Ce code fonctionne bien et l'application est démarrée. Le problème se produit dans l'application qui est lancée lorsque cette ligne provoque une ClassNotFoundException:

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 

Ceci est la trace de la pile:

java.lang.ClassNotFoundException: apple.laf.AquaLookAndFeel 
    at org.apache.tools.ant.AntClassLoader.findClassInComponents(AntClassLoader.java:1361) 
    at org.apache.tools.ant.AntClassLoader.findClass(AntClassLoader.java:1311) 
    at org.apache.tools.ant.AntClassLoader.loadClass(AntClassLoader.java:1070) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251) 
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:374) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:242) 
    at javax.swing.SwingUtilities.loadSystemClass(SwingUtilities.java:1788) 
    at javax.swing.UIManager.setLookAndFeel(UIManager.java:484) 

Si je tente d'exécuter l'application autonome, il fonctionne très bien. L'application de lancement contient exactement la même ligne qui échoue et fonctionne correctement dans le lanceur. Il semble qu'il y ait quelque chose qui ne va pas dans le sens du lancement de l'application. J'ai comparé le System.properties et le classpath lors de l'exécution de l'application à partir du lanceur et autonome (qui fonctionne) et il n'y a pas de différence.

Je ne vois tout simplement pas pourquoi cette classe ne peut pas être trouvée. Est-ce que quelqu'un d'autre a vu ce problème? Toute suggestion est appréciée!

Merci!

Répondre

0

Voici quelques-unes des erreurs les plus difficiles à déboguer. C'est un bon signe que le code fonctionne bien en dehors de Ant, ce qui laisse un problème de classpath. Vérifiez le chemin de classe de votre projet, votre système ne peut pas trouver "apple.laf.AquaLookAndFeel".

Questions connexes