代码之家  ›  专栏  ›  技术社区  ›  Adrian Kiesthardt

缺少依赖项?Java语言lang.NoSuchMethodError

  •  2
  • Adrian Kiesthardt  · 技术社区  · 6 年前

    我在编程方面有点经验,但对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;
        }
    

    发生错误的线路/部件/块准确为:

    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)
    

    我错过了什么?有几篇关于堆栈溢出的帖子建议在依赖项中包含“commons beanutils”。这样做并没有改变任何事情。感谢您的帮助。

    1 回复  |  直到 6 年前
        1
  •  7
  •   Stephen C    6 年前

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

    问题是 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插件打印依赖关系树来诊断此问题: