我的网站需要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!");
}
}
通过在localhost上运行test.php
,它显示:
Error: Could not find or load main class Hello
我试图缩小错误的原因,我的想法是这样的:
exec()
本身存在问题:whoami
按预期打印出apache-user。
Hello.class
的权限代码为rw-r--r--
,由apache-user:webmasters
拥有。 x
权限,在控制台中我仍然可以运行它(使用我自己的用户)。 JVM
执行它(或其他东西);所以Hello.class
的许可无关紧要。
/usr/bin/java
的完整路径 - 对我来说不起作用......
是什么导致错误?
有人可以帮忙吗?详细解决方案表示赞赏我是新手@ _ @
非常感谢!!!
答案 0 :(得分:0)
你试过java -cp /path/to/folder/containing/class/file Hello 2>&1
吗?看来类文件本身不应该是类路径。它应该是 in 类路径。另一方面,如果这是一个.jar文件,那么你将在类路径中提供文件名。
答案 1 :(得分:0)
免费提供路径和Hello.java文件。
使用以下命令测试apache用户的权限:
sudo -u webmasters java -cp /path/to/java/class/file/folder Hello
chmod a+r Hello.class
答案 2 :(得分:0)
我已经解决了这个问题......这是非常意外的。
我更改了类路径。
以前它就像~/myproject/to/java/class/file/folder
。
然后我将其更改为/home/myuser/myproject/to/java/class/file/folder
。
但我完全不明白为什么~
符号不适用于exec()
。