java - 从 CGI 脚本调用 Java 程序失败

标签 java python linux apache cgi

我有一个 Python CGI 脚本,我试图从中调用 Java 程序来执行任务。 Java程序使用JExcelAPI .当我从浏览器运行 Python 脚本时,它失败并显示错误消息,指出它无法从 JExcelAPI 中找到类的类定义。我想这是因为 Python CGI 脚本在 apache 用户下运行,而 apache 用户没有设置适当的环境变量(即 CLASSPATH 变量)。我尝试使用 -classpath/path/to/JExcelAPI 开关调用程序,但这也不起作用。你能帮我找到让 apache 用户知道 JExcelAPI 的方法吗?有没有办法为 apache 用户设置 CLASSPATH 环境变量?

谢谢

最佳答案

想到了几个解决方案:

  1. 创建一个调用 java 程序的 bash 脚本。您可以设置所有您喜欢的变量并在命令行上进行调试,例如sudo -u apache/usr/local/bin/java-task-wrapper。这大大简化了从 cgi 调用它,并且与启动 JVM 相比,bash 的开销可以忽略不计。

  2. 使用 uberjar 等工具创建一个独立的可执行 jar。不再有 classpah 问题,因为包含所有内容:java -jar java-task-standalone.jar

  3. exec java -cp/path/to/JExcelAPI:/my/program/classes com.acme.MainClass

  4. 通常有一个 exec 的变体,它需要一个额外的数组或 hashmap 来添加环境变量。

一些注意事项:

  • 不再全局设置 CLASSPATH 变量,因为它会导致许多冲突。在包装器脚本中,可以减少冲突的可能性。

  • JVM 需要很长时间才能启动,并且执行速度会很慢,因为 JIT 没有机会发挥它的魔力。在像 jetty 或 winstone 这样的轻量级网络服务器中运行您的脚本或在套接字上监听将消除启动成本并启用 JIT 以加快速度。

关于java - 从 CGI 脚本调用 Java 程序失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3783121/

相关文章:

python - 如何避免 python 中的 StopIteration 错误

linux - 无法在 WSL 上使用 Bash 进行 SSH

java - 如何将列表分配为子列表,同时保持元素的原始顺序?

java - 将数组列表中的数据显示到 ListView ,对每个重复对象进行计数并显示为一个对象

Python,计算高效的数据存储方法

python - 尝试清除 Tkinter Entry Widget 时出错

c++ - 现有的 C++ *nix 系统库?

linux - 映射到虚拟地址空间的内核符号表——为什么?

java - org.apache.axis2.AxisFault :Transport error: 407 Error:Proxy Authentication Required

java - android 新手-应该使用什么技术来访问网络服务?