Вызов .jar файлов с PHP - Stanford NLP - Не удалось найти или загрузить основной класс java

У меня есть проект, который использует этот пакет agentile/PHP-Stanford-NLP (интерфейс PHP для инструментов Stanford NLP (POS Tagger, NER, Parser), который вызывает несколько файлов .jar. Все работает нормально на localhost (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 из localhost:

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

Сообщение об ошибке, которое вы отправили:

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

указывает, что ваш класс может быть найден командой java. Это означает, что ваш класс не находится в classpath.

Класс edu.stanford.nlp.parser.lexparser.LexicalizedParser должен находиться внутри stanford-parser.jar, который вы вручную включаете в путь к классам.

В этом сценарии (так как вы сказали в комментариях, что файл действительно существует) есть две основные причины, которые могут вызвать проблему:

  • У вас нет разрешения на чтение для этого файла.

  • Ваш файл каким-то образом поврежден или он не тот, который вы используете в своей локальной среде (он не содержит указанный класс).

Первая причина маловероятна, если вы загрузили файлы тем же пользователем, с которым вы выполняете этот процесс, в любом случае легко проверить и исправить.

Вторая причина может быть решена путем загрузки чистой версии и замены текущего. Вы можете загрузить новую версию из 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

Ответ 2

Могут быть две проблемы

1) Проверьте, есть ли пути /home/forge/mydomainname.com/public/lib /home/forge/mydomainname.com/public/ и соответствующие файлы jar. 2) Проверьте доступ ко всем этим файлам (является ли доступ к этим файлам таким же, как ваш MAMP?)?