首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.io.IOException:无法运行程序“.”:java.io.IOException: error=2,没有这样的文件或目录

java.io.IOException:无法运行程序“.”:java.io.IOException: error=2,没有这样的文件或目录
EN

Stack Overflow用户
提问于 2013-05-10 12:46:19
回答 3查看 51.4K关注 0票数 9

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

代码语言:javascript
复制
/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中使用ProcessBuilder不起作用。

代码语言:javascript
复制
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

我尝试了一些不同的方法,但都没有成功。下面是最后一个测试的示例

代码语言:javascript
复制
        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!");
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-10 12:53:08

试试这个(保持简单) ..。

代码语言:javascript
复制
Process p = Runtime.getRuntime().exec("/usr/bin/libreoffice --headless --convert-to pdf:'writer_pdf_Export' --outdir "+ getDestinationDirectory(order)+" "+getInvoiceFilename()+".fodt");

完全..。

代码语言:javascript
复制
    Process process = null;
    try {
            process = Runtime.getRuntime().exec("/usr/bin/libreoffice --headless --convert-to pdf:'writer_pdf_Export' --outdir "+ getDestinationDirectory(order)+" "+getInvoiceFilename()+".fodt");
    } catch (IOException ex) {
        Logger.getLogger(Documents.class.getName()).log(Level.SEVERE, null, ex);
    }
    BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
    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);
    }
    br.close();
    System.out.println("Program terminated!");
票数 1
EN

Stack Overflow用户

发布于 2013-05-10 12:49:44

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

代码语言:javascript
复制
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中。

而不是

代码语言:javascript
复制
command.add("--convert-to pdf:'writer_pdf_Export' --outdir " + getDestinationDirectory(order) + " " + getInvoiceFilename() + ".fodt")

例如,将每个参数拆分为自己对List.add的调用

代码语言:javascript
复制
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。

票数 6
EN

Stack Overflow用户

发布于 2014-02-12 18:24:58

我已经尝试过这个线程中提出的每一个解决方案,但它都不起作用。

在我的应用程序(在linux中使用TOMCAT的java webapp )中,它只用于创建shell脚本并执行脚本。但是您必须将绝对路径放在脚本中,如果没有,它就不能工作($HOME不工作)。此外,你也可以通过它的论点。

示例:

代码语言:javascript
复制
Runtime.getRuntime().exec("/home/user/myscript.sh param1");
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16482601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档