2

我的网站需要 PHP 在后台运行 Java 程序。因此,PHP 发布exec()了让 Java 完成所有工作的方法。该实现在 Windows 上运行良好,但在 Ubuntu 上完全失败。虽然exec()不起作用,但使用控制台的独立测试工作得很好。

我设置了一个test.php来缩小问题范围:

<?php
$output = exec("java -cp ~/path/to/java/class/file/folder Hello 2>&1");
//$output = exec("whoami");
echo $output;
?>


Hello.java很简单 :

public class Hello {
   public static void main(String[] args) {
      System.out.println("Hello, world!");
   }
}


通过test.php在本地主机上运行,​​它显示:

Error: Could not find or load main class Hello


我试图缩小错误的原因,我的想法是这样的:

  1. exec()本身是有问题的:

    不太可能,因为whoami按预期打印出 apache-user 。

  2. 错误消息的含义:

    我搜索了此错误。像这样的帖子谈论它是由于缺少 classpath引起的。我也不是这种情况,因为在控制台中它可以工作。所以错误消息没有任何意义(是吗?)

  3. 用户/组权限:

    是否可能不允许 apache-user 运行类文件?
    我查了一下,发现权限码是Hello.classto be rw-r--r--,owned by apache-user:webmasters
    但是,即使没有人拥有x该文件的权限,在控制台中我仍然可以运行它(使用我自己的用户)。
    我不确定这里的情况。但我的理解是,通过运行java程序,它实际上是在JVM执行它(或其他东西);所以许可Hello.class无关紧要。


    我发现另一个帖子也有类似的情况。但它的解决方案 - 指定 Java bin 的完整路径/usr/bin/java- 对我不起作用......


是什么导致了错误?

任何人都可以帮忙吗?感谢详细的解决方案!我是新手@_@

非常感谢!!!

4

3 回答 3

0

我已经解决了这个问题......这是非常出乎意料的。

我更改了类路径。

以前是这样的~/myproject/to/java/class/file/folder。我把它改成了/home/myuser/myproject/to/java/class/file/folder.

但我完全不明白为什么~符号不适用于exec().

于 2012-12-16T10:25:33.420 回答
0

你试过java -cp /path/to/folder/containing/class/file Hello 2>&1吗?看来类文件本身不应该是类路径。它应该类路径中。另一方面,如果这是一个 .jar 文件,那么您将在类路径中提供文件名。

于 2012-12-16T09:39:38.843 回答
0

免费提供路径和 Hello.java 文件。

使用以下命令测试 apache 用户的权限:

sudo -u webmasters java -cp /path/to/java/class/file/folder Hello

chmod a+r Hello.class
于 2012-12-16T09:50:54.577 回答