2013-06-26 3 views
1

Я использую xjc для генерации классов из xsd. Генерация должна произойти внутри java-кода. Сейчас я сделал это так:Запуск xjc из кода Java

Process child = Runtime.getRuntime().exec(command); 
     try { 
      System.out.println("waiting..."); 
      child.waitFor(); 
      System.out.println("waiting ended.."); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
      return false; 
     } 

Выход для вышеупомянутой программы:

waiting... 

Я должен использовать классы после того, как они генерируются. Проблема здесь в том, что подпроцесс никогда не выходит, и элемент управления никогда не возвращается в java-программу!
Есть ли способ сделать это без getRuntime().exec()?

ответ

1

попробовать этот

Process child = Runtime.getRuntime().exec(command); 
BufferedReader in = new BufferedReader( 
           new InputStreamReader(child.getInputStream())); 
      String line = null; 
      while ((line = in.readLine()) != null) { 
       System.out.println(line); 
      } 
+0

Я тоже попробовал это. Проблема в том, что он никогда не выходит из этого! Это потому, что процесс никогда не заканчивается! – leet

+0

Это хорошо работает, так как для меня – Ilya

3

Вы можете использовать класс драйвера (com.sun.tools.xjc.Driver) за инструмент командной строки. Это сработало для меня:

import com.sun.tools.xjc.BadCommandLineException; 
import com.sun.tools.xjc.Driver; 
import com.sun.tools.xjc.XJCListener; 
import org.xml.sax.SAXParseException; 

import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 

public class Generator { 

    public static void main(String[] args) throws BadCommandLineException, IOException { 
     final String targetDir = "jaxb-files"; 
     Path path = Paths.get(targetDir); 
     if(!Files.exists(path)) { 
      Files.createDirectories(path); 
     } 
     Driver.run(new String[]{"-d", targetDir, 
       "D:\\dev\\onepoint\\tui\\java\\xsdjsonschema\\src\\main\\xsd\\test.xsd"}, new XJCListener() { 

      @Override 
      public void error(SAXParseException e) { 
       printError(e, "ERROR"); 
      } 

      @Override 
      public void fatalError(SAXParseException e) { 
       printError(e, "FATAL"); 
      } 

      @Override 
      public void warning(SAXParseException e) { 
       printError(e, "WARN"); 
      } 

      @Override 
      public void info(SAXParseException e) { 
       printError(e, "INFO"); 
      } 

      private void printError(SAXParseException e, String level) { 
       System.err.printf("%s: SAX Parse exception", level); 
       e.printStackTrace(); 
      } 
     }); 
    } 
}