【问题标题】:dependency for Apache Commons Configuration2 declared as optionalApache Commons Configuration2 的依赖项声明为可选
【发布时间】:2016-11-26 19:12:42
【问题描述】:

我尝试简单地使用简单的 Apache Commons Configuration2 从属性文件加载配置。这是我的依赖:

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

我尝试启动我的网络应用程序并得到这个:

java.lang.ClassNotFoundException: org.apache.commons.beanutils.DynaBean
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1285)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at com.sun.proxy.$Proxy21.<clinit>(Unknown Source)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:739)
    at org.apache.commons.configuration2.builder.fluent.Parameters.createParametersProxy(Parameters.java:294)
    at org.apache.commons.configuration2.builder.fluent.Parameters.properties(Parameters.java:245)

可爱。从什么时候我们不能使用 Maven 自动获取依赖关系?我查看commons-configuration2 POM on Maven Central 并看到commons-beanutil 被声明为可选

<dependency>
  <groupId>commons-beanutils</groupId>
  <artifactId>commons-beanutils</artifactId>
  <version>1.9.2</version>
  <optional>true</optional>
</dependency>

当我显然需要它时,为什么它被声明为“可选”?

【问题讨论】:

    标签: apache-commons-config


    【解决方案1】:

    这个依赖被标记为可选,因为它只需要库的一些非中心特性,这意味着你仍然可以在没有安装这个依赖的情况下使用大部分的库。

    根据文档:Runtime dependencies for Commons Configuration 2.0

    Commons Configuration 2.0 需要 Java 6 或更高版本。

    在 Maven POM 中声明了许多依赖项。这些都是编译时需要的。但是,在运行时,您只需将依赖项添加到您正在使用的 Commons Configuration 包的部分所需的类路径中。下表可帮助您根据要使用的组件确定必须包含哪些依赖项:

    考虑到表格不容易包含在 SO 答案中,我将仅列出 commons-configuration-2 中要求您包含 beanutils 的功能:

    • 配置生成器
    • ConfigurationDynaBean

    在您的情况下,根据您提供的堆栈跟踪,您正在使用配置构建器,因此需要在您的 pom 中手动包含 beanutils 依赖项。

    【讨论】:

    • 但是documentation say 不是“推荐的方法是使用配置生成器”吗? (强调原文。)所以基本上你是说这个依赖是可选的——除非我以推荐的方式使用库?你没看到那里有一点冲突吗?
    • 如果文档至少在此建议旁边提到这意味着添加可选依赖项,那肯定会更清晰、更直接。对于使用可选的 maven 依赖项,我猜 Apache Commons 团队希望避免为试图最小化使用的依赖项的项目强制加载不必要的依赖项。
    • 一个可选的依赖项,仅用于构建参数(例如,指定要从中加载配置的文件),在整个示例中使用的模式,如果您不显式添加,则会导致模糊的 ClassNotFound 异常它,在他们遇到异常和谷歌之前没有人会想到这样做?这是一个糟糕的 API。
    • 是的,人们为此使用模块!
    • 这就是人们使用 maven 的原因,允许他们分离他们的 API,将构建器放在另一个模块中,该模块具有“beanutils”作为依赖项!
    猜你喜欢
    • 2012-12-04
    • 2020-10-24
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 2018-01-02
    • 2016-07-22
    • 2014-02-19
    • 1970-01-01
    相关资源
    最近更新 更多