我的网站需要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




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


exec()本身是有问题的:
不太可能,因为whoami按预期打印出apache-user。


错误消息是什么意思:

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


用户/组权限:

是否有可能不允许apache-user运行类文件?
我检查了一下,发现Hello.class的许可代码为rw-r--r--,由apache-user:webmasters拥有。
但是,即使没有人拥有该文件的x权限,我仍然可以在控制台中运行它(使用我自己的用户)。
我不确定这里的情况。但是我的理解是,通过运行Java程序,它实际上是JVM执行它(或其他方法);因此Hello.class的许可并不重要。



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



是什么导致错误?

有人可以帮忙吗?详细的解决方案表示赞赏!我是新手@ _ @

非常感谢!!!

最佳答案

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

07-26 09:29
查看更多