java - 依赖缺失? java.lang.NoSuchMethodError 错误

标签 java maven apache-commons

我在编程方面有些经验,但对 Maven 还是个新手。在我最新的项目中,我使用的是 Apache Commons API(配置、cli 等)。它编译但在运行时抛出一个 NoSuchMethod 异常。

我的依赖是这样的:

    <dependency>
        <groupId>commons-beanutils</groupId>
        <artifactId>commons-beanutils</artifactId>
        <version>1.9.3</version>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-configuration2</artifactId>
        <version>2.0</version>
    </dependency>

    <dependency>
        <groupId>commons-cli</groupId>
        <artifactId>commons-cli</artifactId>
        <version>1.4</version>
    </dependency>

这是发生错误的方法:

private Configuration parseConfig(String path) {
        File configFile = new File(path);
        if(!configFile.exists() || configFile.isDirectory()) {
            // Error config file path invalid
            CustomLogger.warn("ERROR file not found");
        }
        Configurations configs = new Configurations();
        Configuration config = null;
        try {
            config = configs.properties(configFile);
        }
        catch (ConfigurationException cex) {
            // Something went wrong
            CustomLogger.warn("Config Exception");
            cex.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return config;
    }

错误发生的行/部分/ block 是:

try {
    config = configs.properties(configFile);
}

堆栈跟踪是:

java.lang.NoSuchMethodError: org.apache.commons.beanutils.PropertyUtilsBean.addBeanIntrospector(Lorg/apache/commons/beanutils/BeanIntrospector;)V
        at org.apache.commons.configuration2.beanutils.BeanHelper.initBeanUtilsBean(BeanHelper.java:631)
        at org.apache.commons.configuration2.beanutils.BeanHelper.<clinit>(BeanHelper.java:89)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Unknown Source)
        at com.sun.proxy.$Proxy0.<clinit>(Unknown Source)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
        at java.lang.reflect.Constructor.newInstance(Unknown Source)
        at java.lang.reflect.Proxy.newProxyInstance(Unknown Source)
        at org.apache.commons.configuration2.builder.fluent.Parameters.createParametersProxy(Parameters.java:294)
        at org.apache.commons.configuration2.builder.fluent.Parameters.fileBased(Parameters.java:185)
        at org.apache.commons.configuration2.builder.fluent.Configurations.fileParams(Configurations.java:602)
        at org.apache.commons.configuration2.builder.fluent.Configurations.fileParams(Configurations.java:614)
        at org.apache.commons.configuration2.builder.fluent.Configurations.fileBasedBuilder(Configurations.java:132)
        at org.apache.commons.configuration2.builder.fluent.Configurations.propertiesBuilder(Configurations.java:238)
        at org.apache.commons.configuration2.builder.fluent.Configurations.properties(Configurations.java:282)
        at com.core.utils.CustomConfiguration.parseConfig(CustomConfiguration.java:130)

我错过了什么? Stack Overflow 上有几篇帖子建议在依赖项中包含“commons-beanutils”。这样做并没有改变任何东西。任何帮助表示赞赏。

最佳答案

这不是缺失的依赖项。它是编译时和运行时依赖关系的不一致。

问题是 org.apache.commons.beanutils.PropertyUtilsBean.addBeanIntrospector 方法是在 Apache Commons BeanUtils 的 1.8.3 和 1.9.0 之间添加的。

POM 依赖项表示您正在针对 1.9.3 编译代码,但证据表明您的 JVM 正在运行时加载旧版本。检查您的运行时类路径/WAR 文件/任何其他文件以确保您只有一个 BeanUtils JAR,并且它是正确的版本。

您的 POM 文件的依赖项之间可能存在未引起注意的冲突。您可以使用 Maven Dependency Plugin 打印依赖树来诊断此问题:

关于java - 依赖缺失? java.lang.NoSuchMethodError 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48745665/

相关文章:

java - for 循环内的 while 循环不起作用

java -cp 。 test.java 与 java test.java

Javacpp:无法设法将 libfdk_aac 添加到 ffmpeg 预设

java - ListUtils.subtract() 如何工作?

java - 我如何使用 Guava 来做到这一点?

java - Java PHP 中的正则表达式类似于输出

java - 当 mySQL 命令为大写时,executeQuery 仅适用于查询?

android - Maven、IntelliJ Idea 和 Android 资源

java - 根据其他属性的存在设置 Maven 属性

java - 使用 Java 递归列出具有给定名称的目录