【发布时间】: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 或 gradlemvn dependency:tree或gradle dependencies会给你更多的见解。