【问题标题】:Could not find or load main class -- Stanford CoreNLP -- Java无法找到或加载主类——Stanford CoreNLP——Java
【发布时间】:2021-01-12 18:32:20
【问题描述】:

我是 java 新手(我有 Java 8)并尝试在 CMD 中运行 CoreNLP 管道:

C:>java -Xmx5g edu.stanford.nlp.pipeline.StanfordCoreNLP -file dr19ald.txt

并不断获得:

错误:无法找到或加载主类 edu.stanford.nlp.pipeline.StanfordCoreNLP

我浏览了类似的帖子,这似乎是一个类路径问题,所以我尝试了以下方法无济于事:

C:>java -cp "C:/stanford-corenlp-4.2.0-models-spanish.jar" edu.stanford.nlp.pipeline.StanfordCoreNLP -file dr19ald.txt

是我错误地添加了类路径还是我遗漏了另一个问题?

更新: 我现在已经试过了:

C:>java -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLP -file dr19ald.txt

C:>java -cp "C:/*" edu.stanford.nlp.pipeline.StanfordCoreNLP -file dr19ald.txt

同样的错误信息。

【问题讨论】:

    标签: java stanford-nlp


    【解决方案1】:

    reference for the command line 表示您应该在类路径中包含多个 jar。他们使用所有分布式 jar (*)。

    根据您的 Java 版本(8 或更高版本),您还应该指定一个模块指令。

    编辑

    我进一步调查了情况,情况相当混乱。 该发行版包括一些第三方库及其 JAR 格式的源代码。其他库根本不包括在内,尽管它们在 pom.xml 中被引用(如果你有工具,可以下载)。

    一个关键问题是 JAXB APIs/Impl 不再是 Java 11 包的一部分,并且代码在通往 Jakarta EE 的过程中正在经历一些变化。 Java 8 仍然包含一个 JAXB 实现,尽管该发行版包含更新的独立文件。该代码依赖于类 com.sun.istack.FinalArrayList,该类不包含在发行版中,但在 POM 中引用的旧 com.sun.xml.bind:jaxb-core 中。

    解决方案

    您需要下载实用程序 JAR istack-commons-runtime-3.0.7.jar(试试 https://mvnrepository.com/artifact/com.sun.istack/istack-commons-runtime)。 我将它放在子目录“m2”中,并在脚本中将其作为 REPO 引用。

    我写了一个小的 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)。

    【讨论】:

    • Java 9 中引入了模块。
    • 我现在已经尝试过 C:\>java -cp "" edu.stanford.nlp.pipeline.StanfordCoreNLP -file dr19ald.txt 和 C:\>java -cp "C: /" edu.stanford.nlp.pipeline.StanfordCoreNLP - 文件 dr19ald.txt 具有相同的错误消息。 (我也有 java 8)
    【解决方案2】:

    您是否已将各种 jar 文件下载到您的根目录中?这听起来像是一场组织噩梦。

    但如果不是,这就解释了为什么 java -cp "*" 不起作用。你需要弄清楚你的 CoreNLP 分发的子目录是什么,并在你的类路径中创建这个目录:

    java -cp "c:\Users\john\nlp\codebase\CoreNLP\lib\*" ... 例如,如果你是我

    如果您需要 Windows 机器上的多个目录,正确的分隔符是 ;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-25
      • 2017-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多