运行* .sh脚本的ClassNotFoundException

时间:2011-12-11 08:19:23

标签: java sh noclassdeffounderror classnotfoundexception

我已下载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 agger

     
    

at 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)中包含的文件夹到该类的整个路径的类。我已经让他解释他认为问题是什么,当他这么做时,我会补充说明这个问题的答案。

3 个答案:

答案 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的正确路径