Używam swojego MacBooka, pracującego w tej chwili pod kontrolą OS X 10.6.6 Snow Leopard, już ponad rok. Nigdy nie było z nim problemów, jednak ostatnio natknąłem się na dość dziwny problem, którego rozwiązania nie udało mi się odnaleźć w zasobach internetu. Pracując nad projektem, pojawiła się w nim pewna zależność Mavena, która spowodowała błędy w czasie uruchomienia aplikacji. Okazało się, że zależność ta posiadała powiązanie bezpośrednio do pliku tools.jar. Plik ten jest dostarczany standardowo wraz z Javą i zawiera w sobie pakiet com.sun.tools. Wszystko byłoby dobrze, gdyby Java pod OS X nie była specjalnie przygotowaną wersją, w której wszystkie standardowe pakiety, w przeciwieństwie do normalnej dystrybucji Java, zostały zamknięte w jeden plik – classes.jar. Efektem tego było, że projekt przestał się uruchamiać pod OS X, gdyż szukał pakietu com.sun.tools bezpośrednio w pliku tools.jar, który w Snow Leopard po prostu nie istnieje. Niestety, zależność Mavena, która spowodowała takiego problemy, była konieczna w projekcie i nie zdawała się zauważać, że wymagany pakiet klas ładowane jest do wirtualnej maszyny z innego pliku jar. A wystarczy podejrzeć plik /Library/Java/Home/bundle/Classes/classes.jar poleceniem:
jar -tf /Library/Java/Home/bundle/Classes/classes.jar
aby przekonać się, że zawiera w sobie com/sun/tools. Pierwszą myślą było utworzenie dowiązania symbolicznego z nazwą tools.jar, które wskazywałoby na plik classes.jar. Pomysł nie okazał się jednak najlepszy, a Java zaczęła narzekać, że posiada dwa pakiety o identycznej nazwie i z identycznymi klasami w dwóch różnych plikach jar. Po chwili namysłu wpadł mi do głosy jednak inny, trochę szalony pomysł. Skoro pakiet com.sun.tools, wraz ze wszystkimi jego klasami, jest ładowany przez wirtualną maszynę, nie ma potrzeby, aby klasy te znajdowały się faktycznie w pliku tools.jar (wirtualną maszynę nie interesuje z którego archiwum załadowała klasę, musi tylko istnieć w systemie). Problemem jest brak pliku tools.jar, a nie brak odpowiednich klas. Wystarczy więc przygotować pusty plik tekstowy, spakować do przy pomocy ZIPa do pliku tools.zip, a następnie zmienić nazwę na tools.jar (pliki jar to po prostu specjalna wersja zipów, nawet można je rozpakować korzystając ze zwykłego zipa). Tak przygotowany plik należy skopiować jeszcze w odpowiednie miejsce:
/Library/Java/Home/bundle/lib/tools.jar
i wszystko zaczyna działać jak należy. Najprawdopodobniej powyższy sposób pomoże każdemu, kto z jakiś powodów napotyka błędy w Mavenie informujące o brakującym pakiecie com.sun.tools. Tak naprawdę to nie brak pakietu, a brak fizycznego pliku tools.jar jest problemem. Jedyną wadą powyższego obejścia jest fakt, że trzeba je wykonywać po każdej aktualizacji Javy dla OS X – na szczęście zdarzają się one stosunkowo rzadko.