从 Java 启动 OpenOffice 服务 (soffice) 的问题(在命令行中工作的命令,但不是从 Java 中)

Posted

技术标签:

【中文标题】从 Java 启动 OpenOffice 服务 (soffice) 的问题(在命令行中工作的命令,但不是从 Java 中)【英文标题】:Problem with starting OpenOffice service (soffice) from Java (command working in commandline, but not from Java) 【发布时间】:2008-12-18 16:10:46 【问题描述】:

我想执行一个简单的命令,它可以在 shell 中工作,但不能在 Java 中工作。 这是我要执行的命令,效果很好:

soffice -headless "-accept=socket,host=localhost,port=8100;urp;" 

这是我试图从 Java 中执行的代码:

String[] commands = new String[] "soffice","-headless","\"-accept=socket,host=localhost,port=8100;urp;\"";
Process process = Runtime.getRuntime().exec(commands)
int code = process.waitFor();
if(code == 0)
    System.out.println("Commands executed successfully");

当我运行这个程序时,我得到“命令执行成功”。 但是,当程序完成时,该进程并未运行。 程序运行后JVM是否有可能杀死程序?

为什么这不起作用?

【问题讨论】:

【参考方案1】:

我不确定我是否记错了,但据我所知,您正在生成命令但从未将它们传递给“执行”方法......您正在执行“”。

尝试使用 Runtime.getRuntime().exec(commands) =)

【讨论】:

【参考方案2】:

我想说我是如何解决这个问题的。 我创建了一个 sh 脚本,它基本上为我运行 soffice 的命令。

然后我从 Java 中运行脚本,它运行良好,如下所示:

公共 void startSOfficeService() 抛出 InterruptedException,IOException //首先我们需要检查soffice进程是否正在运行 字符串命令 = "pgrep soffice"; 进程进程 = Runtime.getRuntime().exec(commands); //需要等待这条命令执行 int 代码 = process.waitFor(); //如果我们从 readLine 得到任何东西,那么我们知道进程正在运行 BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); if (in.readLine() == null) //没有返回,那么我们应该执行该过程 进程 = Runtime.getRuntime().exec("/etc/init.d/soffice.sh"); 代码 = process.waitFor(); log.debug("soffice 脚本启动"); 别的 log.debug("soffice 脚本已经在运行"); 附寄();

我也通过调用这个方法杀死了soffice进程:

公共无效 killSOfficeProcess() 抛出 IOException if (System.getProperty("os.name").matches(("(?i).*Linux.*"))) Runtime.getRuntime().exec("pkill soffice");

请注意,这只适用于 Linux。

【讨论】:

【参考方案3】:

我相信您没有正确处理引用。原始的 sh 命令行包含双引号以防止 shell 解释分号。 shell 在 soffice 进程看到它们之前将它们剥离。

在您的 Java 代码中,shell 永远不会看到参数,因此不需要额外的双引号(用反斜杠转义)——它们可能会使 soffice 感到困惑。

这里的代码去掉了多余的引号(和一个分号)

String[] commands = new String[] "soffice","-headless","-accept=socket,host=localhost,port=8100;urp;";
Process process = Runtime.getRuntime().exec(commands);
int code = process.waitFor();
if(code == 0) 
    System.out.println("Commands executed successfully");

(免责声明:我不懂 Java,也没有测试过这个!)

【讨论】:

【参考方案4】:

"/Applications/OpenOffice.org\ 2.4.app/Contents/MacOS/soffice.bin -headless -nofirststartwizard -accept='socket,host=localhost,port=8100;urp;StartOffice.Service'"

或者简单地转义引号也可以。我们将这样的命令提供给 ant 脚本,最终以 exec 调用结束,就像你上面所说的那样。我还建议每 500 次左右的转换重新启动该过程,因为 OOO 无法正确释放内存(取决于您运行的版本)。

【讨论】:

以上是关于从 Java 启动 OpenOffice 服务 (soffice) 的问题(在命令行中工作的命令,但不是从 Java 中)的主要内容,如果未能解决你的问题,请参考以下文章

怎么用在java中开启openoffice服务??

为啥我的启动 OpenOffice 服务的调用在开发中有效,但在服务器上无效?

openoffice在linux下无法启动服务

从终端启动和打开之间的 OpenOffice 行为差异 - 都在 chroot 中

Linux下OpenOffice的安装与启动

我如何在 Windows 7 中启动服务 openOffice,我有这条线命令,但我不知道如何使用它