从 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()));
这是错误:
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-parser/3.6.0/stanford-parser-3.6.0.jar && mv stanford-parser-3.6.0.jar /home/forge/mydomainname.com/public/stanford-parser.jar
我有一个项目正在使用这个包 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()));
这是错误:
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-parser/3.6.0/stanford-parser-3.6.0.jar && mv stanford-parser-3.6.0.jar /home/forge/mydomainname.com/public/stanford-parser.jar