gpt4 book ai didi

java.io.IOException : Cannot run program "...": java. io.IOException : error=2, 没有那个文件或目录

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:18:06 28 4
gpt4 key购买 nike

我需要从 Java 执行一个外部程序(使用 libreoffice 将 fodt 文件转换为 pdf,就这样发生了)我知道该程序所需的精确命令行:

/usr/bin/libreoffice --headless --convert-to pdf:'writer_pdf_Export' --outdir /home/develop/tomcat/mf/ROOT/private/docs/0/ /home/develop/tomcat/mf/ROOT/private/docs/0/35_invoice.fodt

这在命令行中完美运行。但它在使用 ProcessBuilder 的 Java 中不起作用:

java.io.IOException: Cannot run program "/usr/bin/libreoffice --headless --convert-to pdf:'writer_pdf_Export' --outdir /home/develop/tomcat/mf/ROOT/private/docs/0 /home/develop/tomcat/mf/ROOT/private/docs/0/35_invoice.fodt": java.io.IOException: error=2, No such file or directory

我尝试了一些不同的方法但没有成功。这是上次测试的示例

        List<String> command = new ArrayList<String>();
command.add("/usr/bin/libreoffice");
command.add("--headless");
command.add("--convert-to pdf:'writer_pdf_Export' --outdir " + getDestinationDirectory(order) + " " + getInvoiceFilename() + ".fodt");

ProcessBuilder builder = new ProcessBuilder(command);

Process process = null;
try {
process = builder.start();
} catch (IOException ex) {
Logger.getLogger(Documents.class.getName()).log(Level.SEVERE, null, ex);
}
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
try {
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException ex) {
Logger.getLogger(Documents.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("Program terminated!");

最佳答案

ProcessBuilder构造函数要求外部程序的每个参数都是独立的(以数组或 StringList 的形式)。您收到的第一条异常消息,

Cannot run program "/usr/bin/libreoffice --headless --convert-to pdf:'writer_pdf_Export' --outdir /home/develop/tomcat/mf/ROOT/private/docs/0 /home/develop/tomcat/mf/ROOT/private/docs/0/35_invoice.fodt"

提示它可以找到名为/usr/bin/libreoffice 的程序。它提示找不到名称非常长且奇特的程序 "/usr/bin/libreoffice --headless --convert-to pdf:'writer_pdf_Export' --outdir/home/develop/tomcat/mf/ROOT/private/docs/0/home/develop/tomcat/mf/ROOT/private/docs/0/35_invoice.fodt",因为您将参数连接成一个 String .

代替

command.add("--convert-to pdf:'writer_pdf_Export' --outdir " + getDestinationDirectory(order) + " " + getInvoiceFilename() + ".fodt")

诸如此类,将每个参数拆分为对 List.add

的单独调用
command.add("--convert-to");
command.add("pdf:writer_pdf_Export");

command.add("--outdir");
command.add(getDestinationDirectory(order).toString());

command.add(getInvoiceFilename() + ".fodt");

请注意,“writer_pdf_Export”周围没有撇号,因为它们是 shell 元字符,当您构建一个数组以传递给 exec 时不需要中间 shell。

关于java.io.IOException : Cannot run program "...": java. io.IOException : error=2, 没有那个文件或目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16482601/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com