Процесс не завершается должным образом в Java (время выполнения)

Я выполняю программу CSharp с Java-процессом, создавая файл.exe, но процесс этого файла не отвечает 0 exitCodeОшибки пустые. В Visual Studio все работает нормально, но с Java это создает проблему. Нет вывода и ошибок нет, я застрял в этом, пожалуйста, помогите. Я использую Java 7. Я использую Csc (inbuild compiler in .Net framework for windows) Это дает мне dll ссылка ошибка. Команда следующая

csc /nologo /r:D:/simulatorConfig/ArrayConversion.dll /out:D:\\apache-tomcat-7.0.64\\temp\\tmp749792186557790590.exe D:\\apache-tomcat-7.0.64\\temp\\tmp749792186557790590.cs

stream = new BufferedReader(new InputStreamReader(proc.getErrorStream())); 

выше ошибка, которая является пустой строкой.

код здесь Пожалуйста, посмотрите на него.

public File compile(File sourceFile, LANGUAGE lang) throws InterruptedException, IOException, CompilerException, ConfigurationException {
    String absolutePath = sourceFile.getCanonicalPath();
    // System.out.println("absolutePath : " + absolutePath);
    String destFile;
    if (OsUtils.isWindows()) {
        destFile = absolutePath.replace(lang.getFileExtension(), EXECUTABLE_FILE_SUFFIX);
    } else {
        destFile = absolutePath.replace(lang.getFileExtension(), "");
    }

    String compileCommand = generateCommand(absolutePath, destFile, lang);
    logger.error("compileCommand : " + compileCommand);
    // Compiles and create exe file for execution
    Process proc = Runtime.getRuntime().exec(compileCommand);

    // Wait for process to complete
    int returnValue = proc.waitFor();

    if (returnValue != 0) {
        String errorMsg = getCompilerMessage(sourceFile, proc, lang);
        throw new CompilerException(errorMsg);
    }

    proc.destroy();

    return new File(destFile);
}

private String getCompilerMessage(File sourceFile, Process proc, LANGUAGE lang) throws IOException {

    StringBuilder message = new StringBuilder();
    BufferedReader stream = null;
    String line = null;

    switch (lang) {
    case C:
    case CPP:
        // GNU C/CPP compiler prints compiler errors in standard errors
        // tream
        stream = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
        break;

    case CSHARP:
        // CSharp compiler prints compiler errors in standard output stream
        stream = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
        break;

    }

    while ((line = stream.readLine()) != null) {
        logger.error(line);
        line = line.substring(line.indexOf(sourceFile.getName()) + (int) sourceFile.getName().length());
        if (message.toString().isEmpty()) {
            message.append(lang == LANGUAGE.CSHARP ? "Line" : "").append(line);
        } else {
            message.append("<br/>Line").append(line);
        }
        // message.append(line).append(SystemUtils.LINE_SEPARATOR);
    }

    stream.close();

    return message.toString();
}

private String generateCommand(String sourceFile, String destFile, LANGUAGE lang) throws ConfigurationException {
    // System.out.println("sourceFile : " + sourceFile + " -- destFile : " +
    // destFile);
    Configuration config = new PropertiesConfiguration("system.properties");
    String cmd = "";
    switch (lang) {
    case C:
    case CPP:
        sourceFile = sourceFile.replace("\\", "\\\\");
        destFile = destFile.replace("\\", "\\\\");
        cmd = "g++ " + sourceFile + " -o " + destFile + " " + config.getString("C_CPP_HEADERFILE").trim();
        break;

    case CSHARP:
        sourceFile = sourceFile.replace("\\", "\\\\");
        destFile = destFile.replace("\\", "\\\\");
        logger.error("Config Path : "+config.getString("MONO_PATH"));
        if (OsUtils.isWindows()) {
            cmd = "csc /nologo /r:" + config.getString("CS_HEADERFILE_WIN") + " /out:" + destFile + " " + sourceFile;
        } else {
            cmd = "/opt/mono/bin/mcs /reference:" + config.getString("CS_HEADERFILE") + " /out:" + destFile + " "
                    + sourceFile;
        }

        break;
    }
    logger.info("Command :" + cmd);
    return cmd;
}

2 ответа

Решение

Там было .dll ошибка связывания, когда я пытался сделать то же самое в командной строке с демонстрационными файлами. .dll файл и .exe файл в том же каталоге, что и решил, что моя целевая программа работала безупречно с правильным кодом выхода (0). Так держали другие .dll файл в этом пути D:\apache-tomcat-7.0.64\temp\, и в порядке.

Правило большого пальца говорит .dll а также .exe должен быть в той же директории

При запуске команды с помощью Runtime#execвы ДОЛЖНЫ использовать потоки ошибок и std в каждом случае (не только когда код возврата равен!= 0), иначе внутренние буферы могут / будут заполняться и подпроцесс будет ждать бесконечно, пока кто-нибудь их не использует.

Общим признаком этой проблемы является процесс, который никогда не возвращается, в результате чего целое кажется заблокированным.

Есть несколько способов исправить это, один из самых простых описан здесь: https://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html.

Кроме того, здесь, кажется, есть проблема:

// CSharp compiler prints compiler errors in standard output stream
    stream = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
    break;

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

Другие вопросы по тегам