我有一个Python CGI脚本,我试图调用Java程序来执行任务。 Java程序使用JExcelAPI。当我从浏览器运行Python脚本时,它失败并显示错误消息,它无法从JExcelAPI中找到类的类定义。我想这是因为Python CGI脚本在apache用户下运行,并且apache用户没有设置适当的环境变量(即CLASSPATH变量)。我尝试使用-classpath /path/to/JExcelAPI
开关调用该程序,但这也不起作用。你能帮我找到让apache用户了解JExcelAPI的方法吗?有没有办法为apache用户设置CLASSPATH环境变量?
由于
答案 0 :(得分:2)
我想到了几种解决方案:
创建一个调用java程序的bash脚本。您可以设置所需的所有变量并在命令行上进行调试,例如: sudo -u apache /usr/local/bin/java-task-wrapper
。这简化了从cgi中调用它的过程,与打开JVM相比,bash的开销是可以忽略的。
使用uberjar等工具创建独立的可执行jar。没有更多的classpah问题,因为所有内容都包含在内:java -jar java-task-standalone.jar
exec java -cp /path/to/JExcelAPI:/my/program/classes com.acme.MainClass
通常有一个exec的变体,它需要一个额外的数组或hashmap来添加环境变量。
一些注意事项:
不再进行全局设置CLASSPATH变量,因为它会导致许多冲突。在包装脚本中,可以减少碰撞的可能性。
JVM需要很长时间才能启动,执行速度会很慢,因为JIT没有机会发挥它的魔力。在像jetty或winstone这样的轻量级网络服务器中运行脚本或者在套接字上侦听将消除启动成本并使JIT能够快速完成任务。