Apache Commons CLI DefaultParser NoSuchMethod 错误

Apache Commons CLI DefaultParser NoSuchMethod error

我在尝试创建 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 中找到该库。

尝试了 运行 几种组合,其中 none 确实有效。从好的方面来说,我得到了一个不同的错误。有点。

堆栈跟踪 #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 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。

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

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

根据 avro-tools-1.8.2.jarMETA-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. 之前的类路径中
  4. 重新考虑使用 avro-tools 的需要,如果确实不需要,则删除依赖项。

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