Karnawał z Guava czas zacząć

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


  com.google.guava
  guava
  15.0
  cdi1.0

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.

7 myśli na temat “Karnawał z Guava czas zacząć

  1. A przepraszam, nie doczytałem do końca, więc proszę o usunięcie moich komentarzy 🙂

  2. Ok, błąd może dotyczy CDI 1.0. Ale jeśli serwer aplikacyjny jest zgodny z CDI 1.1 to wszystko powinno śmigać nawet z Guavą w wersji 15.0, ponieważ w Guavie w beans.xml jest bean-discovery-mode=”none”. Nie odpalałem nic na JB7 (o ile się nie mylę to on jest JEE6), ale z logów widzę, że jest tam komunikat z GF4, a mi na GF4 w aplikacji JEE7 (CDI 1.1) Guava 15.0 nie sprawiała już problemów.

  3. Wpis jest trochę nieprecyzyjny, bo komunikat wkleiłem z GF, a lokalnie miałem to na JB7. Generalnie warto wiedzieć, ze Guava strzela fochy w temacie CDI 1.x.

Napisz odpowiedź

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax