#java #stanford-nlp
#java #stanford-nlp
Вопрос:
Я новичок в Java (у меня Java 8) и пытаюсь запустить конвейер CoreNLP в CMD:
C:> java -Xmx5g edu.stanford.nlp.pipeline.StanfordCoreNLP -файл dr19ald.txt
и продолжайте получать:
Ошибка: не удалось найти или загрузить основной класс edu.stanford.nlp.pipeline.StanfordCoreNLP
Я просмотрел похожие сообщения, и, похоже, это проблема с путем к классу, поэтому я попробовал следующее, но безрезультатно:
C:> java -cp «C:/stanford-corenlp-4.2.0-models-spanish.jar » edu.Стэнфорд.нлп.конвейер.StanfordCoreNLP -файл dr19ald.txt
Я неправильно добавил путь к классу или есть другая проблема, которую я упускаю?
ОБНОВЛЕНИЕ: теперь я попробовал:
C:> java -cp «*» edu.stanford.nlp.pipeline.StanfordCoreNLP -файл dr19ald.txt
и
C:> java -cp «C:/*» edu.stanford.nlp.pipeline.StanfordCoreNLP -файл dr19ald.txt
с тем же сообщением об ошибке.
Ответ №1:
Ссылка на командную строку указывает, что вы должны включить в путь к классу не только один jar. Они используют все распределенные банки (*).
В зависимости от версии вашей Java (8 или выше) вы также должны указать директиву modules .
Редактировать
Я дополнительно исследовал ситуацию, и она довольно запутанная. Дистрибутив включает в себя некоторые сторонние библиотеки, а также их исходный код в формате JAR. Другие библиотеки вообще не включены, хотя на них есть ссылки в pom.xml (и загружается, если у вас есть необходимые инструменты).
Ключевая проблема заключается в том, что Api / Impl JAXB больше не являются частью пакета Java 11 и что код претерпевает некоторые изменения на пути к Jakarta EE. Java 8 по-прежнему включает реализацию JAXB, хотя дистрибутив включает новые автономные файлы. Код зависит от класса com.sun.istack.FinalArrayList
, который не включен в дистрибутив, но находится в более старом com.sun.xml.bind:jaxb-core, на который ссылается POM.
Решение
Вам нужно загрузить утилиту JAR istack-commons-runtime-3.0.7.jar
(попробуйте https://mvnrepository.com/artifact/com.sun.istack/istack-commons-runtime ). Я поместил его в подкаталог «m2» и сослался на него в скрипте как на репозиторий.
Я написал небольшой скрипт Windows cmd для запуска обработки.
REM run the Stanford CoreNLP on an input file
@echo off
SET JARS=stanford-corenlp-4.2.0.jar;stanford-corenlp-4.2.0-models.jar
SET JARS=%JARS;jollyday.jar;xom.jar;joda-time.jar;ejml-core-0.39.jar
SET JARS=%JARS%;ejml-ddense-0.39.jar;ejml-simple-0.39.jar;slf4j-api.jar
SET JARS=%JARS%;slf4j-simple.jar;protobuf.jar;javax.activation-api-1.2.0.jar
SET JARS=%JARS%;jaxb-api-2.4.0-b180830.0359.jar;jaxb-impl-2.4.0-b180830.0438.jar
SET REPO=m2
SET JARS=%JARS%;%REPO%istack-commons-runtime-3.0.7.jar
@echo on
java -Xmx3g -cp %JARS% edu.stanford.nlp.pipeline.StanfordCoreNLP -file %1
Я поместил этот скрипт в каталог, из которого я извлек ZIP-файл дистрибутива.
Теперь я могу открыть командную строку Windows, перейти в каталог дистрибутива и запустить свой скрипт, передав входной файл в качестве параметра (%1 в скрипте).
Комментарии:
1. Модули были введены в Java 9.
2. Теперь я попробовал C: > java -cp » » edu.stanford.nlp.pipeline. StanfordCoreNLP -файл dr19ald.txt и C:>java -cp «C:/ » edu.stanford.nlp.pipeline. StanfordCoreNLP -файл dr19ald.txt с тем же сообщением об ошибке. (Также у меня есть java 8)
Ответ №2:
Вы загрузили различные файлы jar в свой корневой каталог? Это звучит как организационный кошмар.
Если нет, это объясняет java -cp "*"
, почему не работает. Вам нужно выяснить, в каком подкаталоге находится ваш дистрибутив CoreNLP, и указать этот каталог в вашем пути к классу:
java -cp "c:UsersjohnnlpcodebaseCoreNLPlib*" ...
например, если вы меня
Если вам нужно несколько каталогов на компьютере с Windows, правильный разделитель ;