ClassNotFoundException работает * .sh скрипт - PullRequest
0 голосов
/ 11 декабря 2011

Я загрузил тег 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), до класса. Я попросил его объяснить, что он думает о проблеме, и когда он это сделает, я добавлю это как ответ на этот вопрос.

Ответы [ 3 ]

1 голос
/ 11 декабря 2011

эти 2 команды указывают на несоответствие между вашей ОС и ОС, для которой был создан скрипт.";"является разделителем пути к классам в Windows, в то время как ":" является разделителем пути к классам везде (например, Linux).

1 голос
/ 11 декабря 2011

Проблема в classpath, он не содержит edu/cmu/cs/lti/ark/tweetnlp/RunPOSTagger class, попробуйте напечатать переменную cp в этом скрипте, возможно, вы что-то пропустили.

Используйте подстановочный знак для "всех банок" в каталоге, например: cp = $ cp: / your / cp / dir / *. Jar

Попробуйте изменить эту строку следующим образом: ф = $ ф:. $ корень / выход / производство / ковчег твит-NLP / * баночка

0 голосов
/ 29 января 2014

Вы можете вызвать arK-твит POS-тегер из java-программы и получить результат.

{
 // Run as a separate system process
 String inputFile = ".\\input.txt";  //contains the input text
 Process proc = Runtime.getRuntime().exec("java -jar .\\ark-tweet-nlp-0.3.2.jar --output-format conll --no-confidence "+inputFile);
    // Then retreive the process output
    BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
    String input;
    while((input = reader.readLine())!= null)
    {
        System.out.println(input);
        //you can also write the input string to a file if you want
    }
    reader.close();
 }

ПРИМЕЧАНИЕ : в команде java, используемой в exec (), убедитесь, что вы указали правильный путь к ark-tweet-nlp.jar

...