2016-11-26 3 views
1

deklariert Ich versuche, einfache Verwendung von einfachen Apache Commons Configuration2 laden Konfiguration aus einer Eigenschaftendatei. Hier ist meine Abhängigkeit:Abhängigkeit für Apache Commons Configuration2 als optional

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

Ich versuche, meine Web-Anwendung zu starten und diese:

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) 

Schöne. Seit wann können wir nicht Maven verwenden, um Abhängigkeiten automatisch zu bekommen? Ich schaue auf die commons-configuration2 POM on Maven Central und sehen, dass Commons-Beanutil als optional deklariert ist.

Warum wird es als "optional" erklärt, wenn ich es offensichtlich brauche?

Antwort

1

Diese Abhängigkeit wird als optional markiert, da sie nur für einige nicht zentrale Funktionen der Bibliothek benötigt wird. Dies bedeutet, dass Sie immer noch den Großteil der Bibliothek verwenden können, ohne dass diese Abhängigkeit installiert ist.

Gemäß der Dokumentation: Runtime dependencies for Commons Configuration 2.0

Commons Configuration 2.0 benötigt Java 6 oder höher.

Viele Abhängigkeiten sind im Maven POM deklariert. Diese werden alle während der Kompilierzeit benötigt. Zur Laufzeit müssen Sie jedoch nur die Abhängigkeiten zu Ihrem Klassenpfad hinzufügen, die für die Teile des von Ihnen verwendeten Commons-Konfigurationspakets erforderlich sind. Die folgende Tabelle hilft Ihnen, zu bestimmen, welche Abhängigkeiten Sie auf den Komponenten basierend enthalten müssen Sie verwenden möchten:

Tabellen Betrachtet man nicht leicht in eine inbegriffen SO beantworten, ich werde nur die Eigenschaften von commons-Konfigurationsliste -2, die Sie Beanutils enthalten erfordert:

  • Configuration Builder
  • ConfigurationDynaBean

In Ihrem Fall basierend auf dem Stack-Trace Sie pro Sie verwenden einen Konfigurations-Builder und müssen daher die Beanutils-Abhängigkeit manuell in Ihren Pom aufnehmen.

+1

Aber die [Dokumentation sagen] (https://commons.apache.org/proper/commons-configuration/userguide/howto_builders.html#Configuration_Builders), dass "Der empfohlene Weg ist die Verwendung einer _Configuration Builder_"? (Betonung im Original.) Also im Grunde sagen Sie, dass diese Abhängigkeit optional ist - es sei denn, ich benutze die Bibliothek in der empfohlenen Weise? Siehst du da nicht einen Konflikt? –

+0

Es wäre sicherlich klarer und einfacher, wenn die Dokumentation zumindest neben dieser Empfehlung erwähnt, dass dies die optionale Abhängigkeit hinzufügt. Um die optionale maven-Abhängigkeit nutzen zu können, wollte das Apache Commons-Team vermeiden, unnötige Abhängigkeiten für Projekte aufzuladen, die versuchen, die verwendeten Abhängigkeiten zu minimieren. – Gorkk

+0

Eine optionale Abhängigkeit, die nur zum Erstellen von Parametern erforderlich ist (z. B. eine Datei angeben, von der config geladen werden soll), ein Muster, das in allen Beispielen verwendet wird, und das zu obskuren ClassNotFound-Ausnahmen führt, wenn Sie es nicht explizit hinzufügen zu tun, bis sie die Ausnahme treffen und Google? Das ist eine * schreckliche * API. –

Verwandte Themen