我已下载CMU ARK Twitter Part-of-Speech tagger以用作大型项目的一部分。为了确保它在插入之前正常工作,我从计算机上项目的根目录运行了项目自述文件中的脚本。我没有做任何改变。这是脚本:
$ ./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 aggerat java.net.URLClassLoader $ 1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
在java.net.URLClassLoader.findClass(未知来源)
在java.lang.ClassLoader.loadClass(未知来源)
at sun.misc.Launcher $ AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)无法找到主类:edu.cmu.cs.lti.ark.tweetnlp.RunPOSTagger。
程序将会退出。线程“main”中的异常
我认为类路径的设置方式有问题。 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 ::
我在exec命令之前回显了cp变量,这是返回的内容:
:脚本/../仓:脚本/../出/生产/柜鸣叫-NLP:脚本/../ mybuild:脚本/../ LIB /柜鸣叫-nlp.jar:脚本/ ../lib/commons-codec-1.4.jar:scripts/../lib/commons-math-2.1.jar:scripts/../lib/jargs.jar:scripts/../lib/posBerkeley.jar:脚本/../ LIB /斯卡拉 - 库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的文本1.1.8.jar
scripts/../lib/ark-tweet-nlp.jar
包含代码的编译版本。所以我觉得它的目的是将它包含在类路径中。这还不够吗?如果是这样,我应该明确地将lib / edu / cmu ...等添加到cp吗?
::编辑2 ::
我通过电子邮件发送了这个项目的创建者之一Kevin Gimpel,他给我发了一个批处理文件,而不是项目中包含的shell脚本。
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
如您所见,他设置了类路径,然后运行引用从src(edu)中包含的文件夹到该类的整个路径的类。我已经让他解释他认为问题是什么,当他这么做时,我会补充说明这个问题的答案。
答案 0 :(得分:1)
类路径中的问题,它不包含edu/cmu/cs/lti/ark/tweetnlp/RunPOSTagger
类,尝试在此脚本中打印cp变量,也许你错过了一些东西。
在目录中为“所有罐子”使用通配符,例如:cp = $ cp:/ your / cp / dir / * .jar
尝试更改此行,如下所示: CP = $ CP:$根/缩小/生产/柜鸣叫-NLP / *罐
答案 1 :(得分:1)
这两个命令表明您的操作系统与脚本之间的操作系统不匹配。 “;”是Windows上的类路径分隔符,而“:”是其他地方的类路径分隔符(例如linux)。
答案 2 :(得分:0)
您可以从java程序中调用arK-tweet POS tagger并获取输出。
{
// 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();
}
注意:在exec()中使用的java命令中,确保给出了ark-tweet-nlp.jar的正确路径