从 PHP 调用 .jar 文件 - Stanford NLP - 无法找到或加载主文件 java class

Calling .jar files from PHP - Stanford NLP - Could not find or load main java class

我有一个项目正在使用这个包 agentile/PHP-Stanford-NLP(PHP Stanford NLP 工具(POS Tagger、NER、Parser)的接口,它调用一些 .jar 文件。一切都是在本地主机 (MAMP) 上工作正常,但是当我将它部署到 laravel forge 时它不再工作了。我在我的服务器上安装了 JRE/JDK、Oracle JDK、Oracle JDK 8 .

这是我用来调用 java 文件的代码片段:

$parser = new \StanfordNLP\Parser(
        public_path().'/stanford-parser.jar',
        public_path().'/stanford-parser-3.4.1-models.jar'
);
$parser = $parser->parseSentence($text);

这是错误来源的代码段:

$parser = $this->lexicalized_parser ? 'edu/stanford/nlp/models/lexparser/englishFactored.ser.gz' : 'edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz';
$osSeparator = $this->php_os == 'windows' ? ';' : ':';
$cmd = $this->getJavaPath()
     . " $options -cp \""
     . $this->getJar()
     . $osSeparator
     . $this->getModelsJar()
     . '" edu.stanford.nlp.parser.lexparser.LexicalizedParser -encoding UTF-8 -outputFormat "'
     . $this->getOutputFormat()
     . "\" "
     . $parser
     . " "
     . $tmpfname;
$process = proc_open($cmd, $descriptorspec, $pipes, dirname($this->getJar()));

https://github.com/agentile/PHP-Stanford-NLP/blob/51f99f1aaa1c3d5822fe634346b2b4b33a7a6223/src/StanfordNLP/Parser.php#L90

这是错误:

Error: Could not find or load main class edu.stanford.nlp.parser.lexparser.LexicalizedParser

已编辑:

这是本地主机的 $cmd 输出:

java -mx300m -classpath */Applications/MAMP/htdocs/mydomainname/public/lib/slf4j-api.jar:/Applications/MAMP/htdocs/mydomainname/public/lib/slf4j-simple.jar:/Applications/MAMP/htdocs/mydomainname/public/stanford-parser.jar:/Applications/MAMP/htdocs/mydomainname/public/stanford-parser-3.4.1-models.jar edu.stanford.nlp.parser.lexparser.LexicalizedParser -encoding UTF-8 -outputFormat wordsAndTags,penn,typedDependencies edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz /private/tmp/phpnlpparserC7ptSf

这是 $cmd 生产输出:

java -mx300m -classpath */home/forge/mydomainname.com/public/lib/slf4j-api.jar:/home/forge/mydomainname.com/public/lib/slf4j-simple.jar:/home/forge/mydomainname.com/public/stanford-parser.jar:/home/forge/mydomainname.com/public/stanford-parser-3.4.1-models.jar edu.stanford.nlp.parser.lexparser.LexicalizedParser -encoding UTF-8 -outputFormat wordsAndTags,penn,typedDependencies edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz /tmp/phpnlpparserRdsoE5

可能有两个问题

1) 请检查路径/home/forge/mydomainname.com/public/lib /home/forge/mydomainname.com/public/ 和相应的jar 文件是否存在。 2) 检查所有这些文件的访问权限(这些文件的访问权限是否与您的 MAMP 相同?)?

您发布的错误消息:

Error: Could not find or load main class edu.stanford.nlp.parser.lexparser.LexicalizedParser

表示可以通过java命令找到您的class。这意味着您的 class 不在 classpath.

class edu.stanford.nlp.parser.lexparser.LexicalizedParser 应该在 stanford-parser.jar 内,您手动将其包含在 class 路径中。

在这种情况下(因为你在评论中说文件确实存在)有两个主要原因可能导致问题:

  • 您没有此文件的读取权限。

  • 您的文件已损坏或与您在本地环境中使用的文件不同(它不包含引用的 class)。

如果您使用与您 运行 相同的用户上传文件,则第一个原因不太可能,无论如何很容易检查和修复。

第二个原因可以通过下载干净版本并替换当前版本来解决。您可以从 Maven Central 下载新版本并使用以下命令替换服务器中的版本:

wget http://central.maven.org/maven2/edu/stanford/nlp/stanford-pa‌​rser/3.6.0/stanford-‌​parser-3.6.0.jar && mv stanford-parser-3.6.0.jar /home/forge/mydomainname.com/public/stanford-parser.jar