【问题标题】:Apache Commons CLI DefaultParser NoSuchMethod errorApache Commons CLI DefaultParser NoSuchMethod 错误
【发布时间】:2019-01-03 11:12:51
【问题描述】:

我在尝试创建DefaultParser 的实例时得到Exception in thread "main" java.lang.NoSuchMethodError: org.apache.commons.cli.Options.hasShortOption(Ljava/lang/String;)Z。

我的代码:

    Options options = new Options();
    // option for day offset
    options.addOption(new Option("d", "day", true, "Day offset. -d 7 will 
    request for last weeks data"));
    //options.addOption("d", "day", true, "Day offset. -d 7 will request for last weeks data");

    CommandLineParser parser = new DefaultParser();
    CommandLine cmd = parser.parse(options, args);

堆栈跟踪:

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.commons.cli.Options.hasShortOption(Ljava/lang/String;)Z
    at org.apache.commons.cli.DefaultParser.handleShortAndLongOption(DefaultParser.java:491)
    at org.apache.commons.cli.DefaultParser.handleToken(DefaultParser.java:243)
    at org.apache.commons.cli.DefaultParser.parse(DefaultParser.java:120)
    at org.apache.commons.cli.DefaultParser.parse(DefaultParser.java:76)
    at org.apache.commons.cli.DefaultParser.parse(DefaultParser.java:60)
    at domain.Main.main(Main.java:60)

第 60 行是这样的:

    CommandLine cmd = parser.parse(options, args);

我只是关注官方 apache 文档 - https://commons.apache.org/proper/commons-cli/usage.html。

是的,该库可以在 jar 中找到。

尝试运行更多组合,但都没有真正奏效。从好的方面来说,我得到了一个不同的错误。有点。

堆栈跟踪 #2

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.commons.cli.Options.getMatchingOptions(Ljava/lang/String;)Ljava/util/List;
    at org.apache.commons.cli.DefaultParser.handleLongOptionWithoutEqual(DefaultParser.java:404)
    at org.apache.commons.cli.DefaultParser.handleLongOption(DefaultParser.java:384)
    at org.apache.commons.cli.DefaultParser.handleToken(DefaultParser.java:239)
    at org.apache.commons.cli.DefaultParser.parse(DefaultParser.java:120)
    at org.apache.commons.cli.DefaultParser.parse(DefaultParser.java:76)
    at org.apache.commons.cli.DefaultParser.parse(DefaultParser.java:60)
    at domain.Main.main(Main.java:61)

【问题讨论】:

  • 你用的是哪个版本?
  • Apache CLI 版本为 1.4 @mcacorner
  • 你是类路径污染的受害者
  • @ZdeněkDavid : 从 mvn dependency:tree 开始 - 检查其输出并查找重复的依赖项
  • 在您的 main 方法中尝试输出以下命令的结果:org.apache.commons.cli.Options.class.getProtectionDomain().getCodeSource().getLocation().toURI() 和 org.apache.commons.cli.DefaultParser.class.getProtectionDomain().getCodeSource().getLocation().toURI()。它们都应该输出相同的文件,但可能不在您的设置中。您可以通过查看System.getProperty("java.class.path") 的输出来进一步调查您的类路径。如果你使用 maven 或 gradle mvn dependency:tree 或 gradle dependencies 会给你更多的见解。

标签: java apache-commons-cli


【解决方案1】:

我使用 apache commons cli 1.4 测试了您的代码,它运行良好

编辑:

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.DefaultParser;


public class Main {
    public static void main(String[] args) throws ParseException {
        Options options = new Options();
        // option for day offset
        options.addOption(new Option("d", "day", true, "Day offset. -d 7 will request for last weeks data"));
        // options.addOption("d", "day", true, "Day offset. -d 7 will request for last
        // weeks data");

        CommandLineParser parser = new DefaultParser();

        CommandLine cmd = parser.parse(options, args);
        System.out.println(cmd.getParsedOptionValue("day"));


    }
}

我使用以下参数运行它: --日期 123 和 -d 123

它会打印 123。

如果错误仍然存​​在,请复制并粘贴上面的代码并检查它是否适合您。

【讨论】:

  • args 变量作为参数来自主方法public static void main(String[] args)。 Apache CLI 版本是 1.4
  • 是的,我知道它来自 main 方法,但是您将什么参数传递给您的示例?
  • 你创建的选项对象告诉你你的程序期待这个:--day value or -d value
  • 尝试运行这些java -jar kafka-client-1.0-SNAPSHOT-export.jar -d=1、java -jar kafka-client-1.0-SNAPSHOT-export.jar -d 1 和这个java -jar kafka-client-1.0-SNAPSHOT-export.jar -d "1"
  • 我最终放弃了,只是去寻找另一个解决方案。仍然很好奇为什么它在我的机器上不起作用。
【解决方案2】:

即avro-tools-1.8.2.jar 自带了自己的commons-cli 版本,与您要使用的版本冲突。

根据avro-tools-1.8.2.jar的META-INF\DEPENDENCIES文件看来是1.2版。

基本上你有三个选择:

  1. 使用与avro-tools-1.8.2.jar 使用的相同版本的commons-cli。 IE。 commons-cli-1.2
  2. 确保commons-cli 的版本在avro-tools-1.8.2.jar 之前的类路径中
  3. 重新考虑使用avro-tools 的必要性,如果不需要,请删除依赖项。

如果你真的需要avro-tools,第一个选项可能是你要走的路。 seconds 选项可能会首先解决问题,但可能会破坏 avro-tools 的功能,因为将使用与 commons-cli 的 1.4 版本冲突。如果您真的不需要avro-tools(不是在谈论avro,而是专门讨论tools jar),我建议您删除avro-tools 依赖项。 avro-tools 似乎不适合作为依赖项被拉取,但更像是一个独立的应用程序。它捆绑了一堆外部库,这些库最终都可能导致您这边发生版本冲突。

【讨论】:

    猜你喜欢
    • 2013-03-21
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 2016-12-18
    • 2018-09-13
    相关资源
    最近更新 更多