Java无法进行系统调用

时间:2014-04-22 18:05:46

标签: java java-8

我使用Java在LaTeX中格式化一首诗,然后进行编译。 LaTeX化工作完全正常,但我不知何故无法运行命令。这是我的LaTeX调用的问题吗?出于某种原因,当我使用Java编写等效的批处理文件然后运行它时,Java什么都不做,但是当我从shell运行批处理文件时,它可以工作。

    /**
     *
     * @param title the title of the poem
     * @param poem a <code>List</code> with one string for each line of the
     * poem.
     * @throws FileNotFoundException
     */
    protected static void writePDF(final String title, List<String> poem) throws FileNotFoundException {
    final StringBuilder latex = new StringBuilder(0);
    // I know I shouldn't concatenate like this; I'll fix it later.
    // eeeewww escapes
    latex.append(
        "\\documentclass[letterpaper,12pt,article,oneside]{memoir}\n"
        + "\\usepackage[utf8]{inputenc}\n"
        + "\\usepackage{ebgaramond}\n"
        + "\\usepackage{hyperref}\n"
        + "\\usepackage[protrusion,expansion,kerning,tracking,spacing]{microtype}\n"
        + "\\linespread{1.3}\n"
        + "\\nonfrenchspacing\n"
        + "\\microtypecontext{spacing=nonfrench}\n"
        + "\\begin{document}\n"
        + "\\title{" + title + "}\n"
        + "\\author{}\n"
        + "\\date{\\today}\n"
        + "\\maketitle\n"
        + "\\setlength{\\parindent}{0pt}\n"
        + "\\setlength{\\parskip}{\\baselineskip}\n");
    // Go Java 8!
    poem
        .stream()
        .map((String s)
            // Original poem's in HTML
            -> s.replace("<p>", "\n\n").replace("<br>", "\\\\\n"))
        .forEach(latex::append);
    latex.append("\n\\end{document}");
    final String latexstr = latex.toString().replace("...", "\\ldots");
    final String filename = title + ".tex";
    final File file = new File(filename);
    try (final PrintWriter pw = new PrintWriter(new BufferedOutputStream(new FileOutputStream(file)))) {
        pw.print(latexstr);
    }
    final String path = file.getAbsolutePath()
        .substring(0, file.getAbsolutePath().lastIndexOf("\\")) + "\\";
    System.out.println("Path: " + path);

    final String LaTeXcmd = "pdflatex \""
        + path
        + title + "\"";
    final File script = new File(""
        + rand.nextDouble()
        + "compile"
        + title.replace(" ", "_")
        + ".bat");
//I originally wanted just to write a batch file and run it from Java.
//  try (final PrintWriter pw = new PrintWriter(new BufferedOutputStream(new FileOutputStream(script)))) {
//      pw.print(""
//          //"@echo off\n"
//          + "cd " + path + "\n"
//          + LaTeXcmd + "\n"
//          //          + "del \"" + path + title + ".aux\"\n"
//          //          + "del \"" + path + title + ".log\"\n"
//          //          + "del \"" + path + title + ".out\"\n"
//          //          + "del \"" + path + title + ".tex\"\n"
//          //          + "start /b \"\" cmd /c del \"%~f0\"&exit /b\n"
//
//          + "msg * all\n"
//      );
//  }
    try {
        System.out.println("latexcmd " + LaTeXcmd);
        final File workingdir = new File(path);
        System.out.println("workingdir " + workingdir);
// >>>>>>>>>>>>>>>> IS THIS CORRECT? <<<<<<<<<<<<<<<<
        Runtime.getRuntime().exec(LaTeXcmd, new String[]{}, workingdir);
// This statement works perfectly fine (Windows).
//      Runtime.getRuntime().exec("msg * all");
    } catch (IOException ex) {
        Logger.getLogger(PoetryBackend.class.getName()).log(Level.SEVERE, null, ex);
    }

    }

1 个答案:

答案 0 :(得分:1)

这不正确。尝试

String command = new String[] {"cmd", "/c", LaTeXcmd };
Runtime.getRuntime().exec(command, new String[]{}, workingdir);

因为否则你不会通过命令解释器执行它,如果你希望它像你从cmd提示符那样运行它,那就是你想要的。

这也适用于运行.bat文件。