2012-02-27 9 views
14

Otrzymuję ten wyjątek podczas próby wywołania usługi sieci web SOAP za pomocą osi. zasadniczo napisałem klienta osi.wspólny konflikt dziennik logowania z klientem mydła apache osi

org.apache.commons.discovery.DiscoveryException: Class org.apache.commons.logging.impl.SLF4JLogFactory does not implement org.apache.commons.logging.LogFactory. 

Kiedy usunąć wszystkie słoiki common rejestrowania, byłbym w stanie usunąć te błędy ale te słoiki są pochodzących z innych interfejsów API, nie mam kontroli nad nimi.

Czy istnieje sposób na przezwyciężenie tego problemu?

+0

Prawdopodobnie najlepsze rozwiązanie podano poniżej. Ale jeśli używasz projektu maven, możesz usunąć rejestrowanie commons przez wykluczenie. osi osi 1,4 \t \t \t \t fotografia wspomagane \t \t \t fotografia wspomagane Purushothaman

Odpowiedz

9

Istnieje dość szczegółowe wyjaśnienie, na czym polega problem i sposoby debugowania go w wersji commons logging documentation. Twój szczególny problem może być,

Jest też inny, bardziej niezwykły sposób, w jaki ta obsada może zabraknąć: nawet gdy binarny jest kompatybilny klasa realizacja załadowany na starcie może być połączony z inną instancję Klasa LogFactory. Aby uzyskać więcej informacji, zobacz tech guide.

6

Link do wyżej wymienionych Documentation do sekcji "Poprawki" sugeruje to

-Dorg.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.LogFactoryImpl 

w konfiguracji. Dla niektórych osób może to być łatwiejsze do włączenia tego kodu:

static 
{ 
    System.setProperty(LogFactory.FACTORY_PROPERTY, LogFactory.FACTORY_DEFAULT); 
} 
1

Żadne z tych rozwiązań pracował dla mnie. I dowiedzieć się, moje rozwiązanie w dokumentacji slf4j

http://slf4j.org/faq.html#excludingJCL

alternatywa 2) pod warunkiem, zakres Commons rejestrowania może być dość prosty i dogodnie wykluczony jako zależność deklarując ją w przewidzianym zakresie w pom. plik XML twojego projektu. Rzeczywiste klasy rejestrowania commons byłyby zapewnione przez jcl-over-slf4j. Ten przekłada się na następującym fragmencie pom pliku:

<dependency> 
    <groupId>commons-logging</groupId> 
    <artifactId>commons-logging</artifactId> 
    <version>1.1.1</version> 
    <scope>provided</scope> 
</dependency> 

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>jcl-over-slf4j</artifactId> 
    <version>1.7.21</version> 
</dependency> 

Pierwsza deklaracja zależność zasadniczo stwierdza, że ​​ commons-logging będzie „jakoś” dostarczony przez środowisko. Druga deklaracja zawiera jcl-over-slf4j do twojego projektu. Jako jcl-over-slf4j jest idealnym zamiennikiem binarnym dla logowania commons, pierwsze asercja staje się prawdą. Niestety, podczas deklarowania logowania commons w podanym zakresie dostaje zadanie , twoje IDE, np. Eclipse nadal będzie umieszczał commons-logging.jar na ścieżce klasy projektu, jak widzi IDE. Będziesz musiał uczynić pewnym, że jcl-over-slf4j.jar jest widoczny przed commons-logging.jar przez twojego IDE.

Dokumentacja SLF4J daje więcej alternatyw, to działało dla mnie.