Запуск xjc из кода Java

Я использую xjc для создания классов из xsd. Генерация должна происходить внутри 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() ?


person leet    schedule 26.06.2013    source источник


Ответы (2)


На самом деле вы можете использовать класс драйвера (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();
            }
        });
    }
}
person gil.fernandes    schedule 19.01.2017

попробуй это

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);  
            }  
person shreyansh jogi    schedule 26.06.2013
comment
Я тоже пробовал это. Проблема в том, что он никогда не выходит из этого!! Это потому, что процесс никогда не заканчивается! - person leet; 26.06.2013