Компиляция класса с использованием кода Java с использованием процесса - PullRequest
0 голосов
/ 18 мая 2010

У меня есть этот кусок кода, который компилирует класс с именем tspClassName, когда я компилирую с использованием этого кода:

           Process compileProc = null;
        try {
            compileProc = Runtime.getRuntime().exec("javac -classpath ."
                       + File.separator + "src" + File.separator
                       + File.separator + "generated." + tspClassName + ".java -d ." + File.separator + "bin");
        // catch exception
           if (compileProc.exitValue() != 0) 
           {
               System.out.println("Compile exit status: "
                          + compileProc.exitValue());
                      System.err.println("Compile error:" +
                              compileProc.getErrorStream());

это выводит это: "Статус выхода компиляции: 2 Ошибка компиляции: java.io.FileInputStream@17182c1 " В противном случае класс tspClassName.java компилируется без ошибок, поэтому я предполагаю, что это связано с путем, и в моем проекте eclipse файл tspClassName.java находится в пакете homework4.generated внутри src. использовать в коде?

спасибо

Ответы [ 6 ]

1 голос
/ 18 мая 2010

Ваш Java-код запускает команду, которая выглядит примерно так:

javac -classpath ./src//generated.ClassName.java -d ./bin

Не думаю, что ты этого хочешь. Я думаю, вам нужно изменить свой Java-код, чтобы он генерировал что-то вроде:

javac -classpath . src/generated/ClassName.java -d ./bin
                  ^

Обратите внимание на пробел после classpath (".").

1 голос
/ 18 мая 2010

Вы можете использовать javax.tools.JavaCompiler или JCI , которые обертывают эту функцию.

0 голосов
/ 27 декабря 2013

во-первых, вы должны использовать библиотеку apache exec, если вы хотите использовать такие процессы. Apache exec library делает все очень просто.

Во-вторых, вы должны напечатать свой вывод std и потоки ошибок std вашего процесса, который вы выполняете. Без них невозможно узнать, что выполняется и что он делает.

В-третьих, попробуйте напечатать полную строку cmd, которую выполняет процесс. Скопируйте эту строку cmd и попробуйте запустить ее вручную. В большинстве случаев вы находите свои проблемы таким образом.

И наконец, если ваша цель - просто скомпилировать класс / сгенерировать или изменить файл класса во время выполнения, дайте this хорошее чтение и попытку. У него тоже есть примеры. Вы также можете попробовать библиотеки генерации кода / управления классами, такие как BCEL, JavaAssist и т. Д.

Удачи.

0 голосов
/ 27 декабря 2013

Проблема может быть в расположении файла вместо использования параметра с одним значением для exec () Попробуйте метод 3 параметров, который имеет команду, окружение и местоположение в качестве параметров, которые помогают нам перейти в указанное местоположение, и выполните команду

проверьте 6 и 8 методов для справки http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html

 Process compile = Runtime.getRuntime().exec("javac "+fname,null,new File(dir));
0 голосов
/ 18 мая 2010

Я рекомендую сделать что-то вроде этого:

    String command = String.format(
        "javac -classpath . src%1$sgenerated%1$s%2$s.java -d .%1$sbin",
        File.separator,
        tspClassName
    );
    LOG("Executing " + command);
    //... exec(command) etc

... где LOG - это то, что ваша структура ведения журнала использует для записи команды, которая будет выполнена. Это очень поможет в отладке, так как было указано, что созданная вами команда некорректна.

Также вы можете создать строку, используя replace

    String command =
        "javac -classpath . src/generated/ClassName.java -d ./bin"
        .replace("/", File.separator)
        .replace("ClassName", tspClassName);

Возможно, это более читабельно.


при сливе Process потоки

Комментарий ОП предполагает, что waitFor() никогда не вернется. Вероятно, это вызвано ошибками / предупреждениями компиляции в процессе javac.

С API :

Поскольку некоторые собственные платформы предоставляют ограниченный размер буфера только для стандартных входных и выходных потоков, невозможность оперативной записи входного потока или чтения выходного потока подпроцесса может привести к блокировке подпроцесса и даже к взаимной блокировке.

Вам необходимо непрерывно сливать Process.getOutputStream() et.al.

Смотри также

  • Java Puzzlers, Puzzle 82: Пивной взрыв

Смежные вопросы

0 голосов
/ 18 мая 2010

Я думаю, что правильный способ выполнения такой работы - программно с использованием API javax.tools, а не внешнего процесса:

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler()

Справка:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...