Czytam obecnie książkę „Getting Started with Google Guava” i mam zamiar skończyć ją przed sylwestrem. Karnawał minie więc pod znakiem zgłębiania się w bibliotekę Google Guava.
Wiele osób traktuje tą bibliotekę jako dostawcę kilku prostych funkcjonalności takich jak interfejsy Function, Predicate czy klasy narzędziowe do pracy z kolekcjami jak Collections2. W praktyce biblioteka ta jest jednak świetnym rozwiązaniem jeżeli chcemy mieć dużą „narzędziownię”.

Dziś jednak nie o funkcjonalności Guavy, ale o tym co czeka nas jak spotka się ona, wersja 14.0.1+, z JBossem 7. Otóż jest sobie dość śmieszny bug w Guavie. Polega on na udostępnieniu w domyślnej konfiguracji wsparcia dla CDI 1.0. To znaczy dokładnie, że w jarze ściaganym z repozytorium mavena mamy wsadzony plik beans.xml. W momencie startu aplikacji dostajemy na twarz:

Listing 1. Błąd startu JBossa

[2013-05-23T15:08:35.664-0700] [glassfish 4.0] [SEVERE] [] [javax.enterprise.system.core] [tid: _ThreadID=34 _ThreadName=admin-listener(2)] [timeMillis: 1369346915664] [levelValue: 1000] [[
  Exception while loading the app : CDI deployment failure:WELD-001408 Unsatisfied dependencies for type [Set<Service>] with qualifiers [@Default] at injection point [[BackedAnnotatedParameter] Parameter 1 of [BackedAnnotatedConstructor] @Inject com.google.common.util.concurrent.ServiceManager(Set<Service>)]
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [Set<Service>] with qualifiers [@Default] at injection point [[BackedAnnotatedParameter] Parameter 1 of [BackedAnnotatedConstructor] @Inject com.google.common.util.concurrent.ServiceManager(Set<Service>)]

Co z tym można zrobić? Generalnie problem polega na niekonsekwencji w nazewnictwie zależności. Najprawdopodobniej komuś w Google pomyliło się i zamienił kwalifikatory paczek. By dodać guavę w projekcie, który chcemy umieścić na JBossie, czy szerzej w kontenerze CDI, wystarczy zamiast standardowej zależności umieścić…

Listing 2. Zależność do Guavy

<dependency><groupid>com.google.guava</groupid><artifactid>guava</artifactid><version>15.0</version><classifier>cdi1.0</classifier></dependency>

Czyli jeżeli chcesz mieć guavę bez skonfigurowanego, źle, CDI należy użyć zależności, która na zdrowy rozum ma skonfigurowane CDI.