从CGI脚本调用Java程序失败

2 投票
1 回答
1028 浏览
提问于 2025-04-16 04:31

我有一个用Python写的CGI脚本,想通过它来调用一个Java程序完成某个任务。这个Java程序使用了JExcelAPI。当我从浏览器运行这个Python脚本时,它出错了,提示找不到JExcelAPI中类的定义。我猜这是因为这个Python CGI脚本是以apache用户的身份运行的,而apache用户没有设置合适的环境变量(特别是CLASSPATH变量)。我试过用-classpath /path/to/JExcelAPI这个参数来调用程序,但也没有成功。你能帮我找到让apache用户识别JExcelAPI的方法吗?有没有办法为apache用户设置CLASSPATH环境变量?

谢谢

1 个回答

2

这里有几种解决方案可以考虑:

  1. 可以创建一个bash脚本来调用Java程序。你可以设置你想要的所有变量,并在命令行上进行调试,比如说 sudo -u apache /usr/local/bin/java-task-wrapper。这样从cgi调用它就简单多了,而且bash的开销相对于启动一个Java虚拟机来说几乎可以忽略不计。

  2. 使用像uberjar这样的工具创建一个独立的可执行jar文件。这样就不再有类路径的问题,因为所有东西都包含在里面了: java -jar java-task-standalone.jar

  3. 可以用 java -cp /path/to/JExcelAPI:/my/program/classes com.acme.MainClass 来执行。

  4. 通常有一种exec的变体,可以接受一个额外的数组或哈希表来添加环境变量。

一些注意事项:

  • 现在不再全局设置CLASSPATH变量,因为这会导致很多冲突。在包装脚本中这样做是可以的,因为冲突的可能性会减少。

  • Java虚拟机启动的时间比较长,执行速度也会慢,因为JIT(即时编译器)没有机会发挥作用。把你的脚本放在像jetty或winstone这样的轻量级web服务器上运行,或者监听一个socket,这样可以消除启动成本,让JIT能够加快速度。

撰写回答