Я загрузил тег 100 * * CMU ARK Twitter для разговорной речи для использования в рамках более крупного проекта. Чтобы убедиться, что он работает, прежде чем подключать его, я запустил скрипт, который находится в README проекта, из корня проекта на моем компьютере. Я не сделал никаких изменений. Это скрипт:
$ ./runTagger.sh -input example_tweets.txt -output tagged_tweets.txt
Я получил эту ошибку:
java.lang.NoClassDefFoundError: edu / cmu / cs / lti / ark / tweetnlp / RunPOSTagger
Вызывается: java.lang.ClassNotFoundException: edu.cmu.cs.lti.ark.tweetnlp.RunPOST agger
на java.net.URLClassLoader $ 1.run (неизвестный источник)
at java.security.AccessController.doPrivileged (собственный метод)
at java.net.URLClassLoader.findClass (неизвестный источник)
at java.lang.ClassLoader.loadClass (неизвестный источник)
at sun.misc.Launcher $ AppClassLoader.loadClass (неизвестный источник)
at java.lang.ClassLoader.loadClass (Неизвестный источник) Не удалось найти основной класс: edu.cmu.cs.lti.ark.tweetnlp.RunPOSTagger.
Программа будет закрыта. Исключение в теме "главная"
Я считаю, что что-то не так с тем, как устанавливается путь к классам. Сценарий runTagger вызывает другой сценарий, classwrap.sh, который должен устанавливать путь к классу путем доступа к корню, из которого вызывается скрипт, но почему-то он не работает.
Вот runTagger.sh
#!/bin/bash
$(dirname $0)/scripts/classwrap.sh -Xmx1g edu.cmu.cs.lti.ark.tweetnlp.RunPOSTagger "$@"
Вот classwrap.sh
#!/bin/bash
# Set up classpath and invoke 'java' with it
set -eu
root=$(dirname $0)/..
cp=""
# Eclipse and IDEA defaults
cp=$cp:$root/bin
cp=$cp:$root/out/production/ark-tweet-nlp
# our build dir
cp=$cp:$root/mybuild
cp=$cp:$(echo $root/lib/*.jar | tr ' ' :)
# Twitter Commons text library stuff
cp=$cp:$(echo $root/lib_twitter/*.jar | tr ' ' :)
exec java -cp "$cp" "$@"
Я не уверен, в чем проблема. Очевидно, что я n00b, когда дело доходит до этого, поэтому я пришел сюда. Любые предложения будут оценены.
:: EDIT ::
Я повторил переменную cp перед командой exec, и вот что было возвращено:
: скрипты /../ бен: сценарии /../ из / производства / ARK-твит-NLP: скрипты /../ mybuild: скрипты /../ Библиотека / ковчег твит-nlp.jar: скрипты / ../lib/commons-codec-1.4.jar:scripts/../lib/commons-math-2.1.jar:scripts/../lib/jargs.jar:scripts/../lib/posBerkeley.jar: сценарии /../ библиотека / библиотека Scala-2.9.0.1.jar: скрипты /../ lib_twitter / гуава-r09.jar: скрипты /../ lib_twitter / Lucene-ядро-3.0.3.jar: скрипты /. ./lib_twitter/text-0.1.0.jar:scripts/../lib_twitter/twitter-text-1.1.8.jar
scripts/../lib/ark-tweet-nlp.jar
содержит скомпилированную версию кода. Поэтому я чувствую, что намерение было сделать так, чтобы оно было включено в путь к классам. Это не достаточно? Если так, я должен явно добавить lib / edu / cmu ... и т. Д. В cp?
:: РЕДАКТИРОВАТЬ 2 ::
Я отправил электронное письмо Кевину Гимпелю, одному из создателей этого проекта, и он прислал мне пакетный файл для запуска вместо сценариев оболочки, которые включены в проект.
java -cp lib/ark-tweet-nlp.jar;lib/commons-codec-1.4.jar;lib/commons-math-2.1.jar;lib/jargs.jar;lib/posBerkeley.jar;lib/scala-library-2.9.0.1.jar -Xmx1g edu.cmu.cs.lti.ark.tweetnlp.RunPOSTagger -input example_tweets.txt -output test.txt
Как вы можете видеть, он установил classpath и затем запустил класс, ссылаясь на полный путь от папки, содержащейся в src (edu), до класса. Я попросил его объяснить, что он думает о проблеме, и когда он это сделает, я добавлю это как ответ на этот вопрос.