【问题标题】:Calling Java from PHP vs shell - java.lang.NoClassDefFoundError:从 PHP 与 shell 调用 Java - java.lang.NoClassDefFoundError:
【发布时间】:2013-09-02 19:23:28
【问题描述】:

我有两个 java 类,它们位于 .../jtest/StepRegTest 目录中,包括“package StepRegTest;”指令。

选项 1。我直接从 shell 调用它:

[jtest]# java StepRegTest.Main

一切正常。

选项 2。我通过 PHP exec 调用 java:

<?php
echo getcwd() . "\n";
exec("java StepRegTest.Main 2>&1", $output);
print_r( $output );
?>

当我从 shell 调用 PHP 文件时,PHP 文件与选项 1 位于同一目录 jtest 中。但是,它返回一个错误:

线程“main”java.lang.NoClassDefFoundError 中的异常:com/quinncurtis/matpackjava/DMatBase

引用这些缺失类的 jar 存档位于 CLASSPATH 中。 该类的导入参考是:

import com.quinncurtis.matpackjava.DDMat;

请注意,当我从 shell 执行代码时,一切正常。

这里有什么问题?为什么它可以在 shell 中工作,而不是在 PHP 中?

谢谢!

【问题讨论】:

  • 可能你的 CLASSPATH 没有在 PHP 版本中设置。试试这个:exec("export CLASSPATH=.;java StepRegTest.Main 2&gt;&amp;1", $output);

标签: java php shell unix


【解决方案1】:

如果正在使用 CLASSPATH 环境变量,请验证它是在进行 php exec() 调用时设置的;它可能会迷路。

一个简单的检查方法是:

<?php
echo getcwd() . "\n";
exec("env", $output);
print_r( $output );
?>

要在php脚本中设置CLASSPATH变量,可以这样做:

putenv("CLASSPATH=/path/to/lib.jar");

这是一个描述 putenv() 的页面:

http://php.net/manual/en/function.putenv.php

【讨论】:

  • 请发表评论。问题永远不能成为答案。
  • 是的,你是对的 - 我没有看到 CLASSPATH 正在执行 exec("env", $output);来自 PHP。但是从 shell 调用“env”会返回所有正确的路径。这是为什么?我应该在哪里声明 PHP 的所有路径?
  • 不确定。从 shell 运行时必须设置和导出 CLASSPATH,否则 java 看不到它。那么,php 脚本不是直接从同一个 shell 运行的吗?如果在php脚本中设置路径没问题,我会想办法的。
  • 太棒了!通过“putenv”设置 CLASSPATH 已经解决了这个问题。我仍然无法理解为什么 PHP 看不到所有从 shell 中清晰可见的系统变量。
  • 我还有另一个问题 - PHP 返回“错误:无法找到或加载主类 StepRegTest.Main”。从 shell 执行完全相同的 java 命令可以正常工作...
猜你喜欢
  • 1970-01-01
  • 2012-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-20
  • 1970-01-01
  • 2014-09-04
  • 2012-03-13
相关资源
最近更新 更多