我有一个 Python CGI 脚本,我试图从中调用 Java 程序来执行任务。 Java程序使用JExcelAPI .当我从浏览器运行 Python 脚本时,它失败并显示错误消息,指出它无法从 JExcelAPI 中找到类的类定义。我想这是因为 Python CGI 脚本在 apache 用户下运行,而 apache 用户没有设置适当的环境变量(即 CLASSPATH 变量)。我尝试使用 -classpath/path/to/JExcelAPI
开关调用程序,但这也不起作用。你能帮我找到让 apache 用户知道 JExcelAPI 的方法吗?有没有办法为 apache 用户设置 CLASSPATH 环境变量?
谢谢
最佳答案
想到了几个解决方案:
创建一个调用 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 以加快速度。
关于java - 从 CGI 脚本调用 Java 程序失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3783121/