从 PHP 脚本调用 Swing Java 应用程序


Call Swing Java application from PHP script

我需要从Linux中的PHP脚本调用Swing Java应用程序。Java应用程序使用swing,但其主框架是不可见的,因此在设置DISPLAY环境之后。变量 I 能够从 tty2 运行它(从没有 x11 的终端)。问题是我不能从PHP脚本中做同样的事情。我使用以下代码片段:

$sys = system("export DISPLAY=:0.0", $output);
$sys = system("java -jar scheduler.jar -i7.txt -q2 -a6 -s -e ", $output);

我在/var/log/apache2/error.log 中得到以下内容:

    Exception in thread "main" java.awt.HeadlessException
at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:159)
at java.awt.Window.<init>(Window.java:432)
at java.awt.Frame.<init>(Frame.java:403)
at java.awt.Frame.<init>(Frame.java:368)
at javax.swing.JFrame.<init>(JFrame.java:158)
at net.sukharevd.cssw.scheduler.view.AppFrame.<init>(AppFrame.java:51)
at net.sukharevd.cssw.scheduler.Main.main(Main.java:11)

我也尝试在 java 之后添加 -Djava.awt.headless=true 参数,但没有成功:

Exception in thread "main" java.awt.HeadlessException: 
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:159)
at java.awt.Window.<init>(Window.java:432)
at java.awt.Frame.<init>(Frame.java:403)
at java.awt.Frame.<init>(Frame.java:368)
at javax.swing.JFrame.<init>(JFrame.java:158)
at net.sukharevd.cssw.scheduler.view.AppFrame.<init>(AppFrame.java:51)
at net.sukharevd.cssw.scheduler.Main.main(Main.java:11)

帮助我使Java应用程序以正确的方式从PHP执行。

好吧,事实是您获得HeadlessException意味着您正在无头环境中启动应用程序(例如,没有显示支持)。

因此,添加"-Djava.awt.headless=true"将起到同样的作用。

它甚至在文档中解释道:http://docs.oracle.com/javase/6/docs/api/java/awt/HeadlessException.html

公共类 HeadlessException 扩展 不支持的操作异常

当依赖于键盘、显示器或鼠标的代码 在不支持键盘、显示器或 鼠。

所以基本上你必须从应用程序代码中删除任何依赖于显示的代码(例如 JFrames 创建和其他类似的东西)。之后,您将能够正常执行它,而无需获得无头异常。

不要把它安装在tomcat上,只需在你的.jar文件夹中执行你的JavaBridge.jar,并做 :

include("localhost:8080/Java.inc");
java_require(".");
$class = java("yourpackage.Class");

我成功地打开了碧玉报告。