W skrócie - niezależność na poziomie kodu nie jest tym samym co niezależność na poziomie strukturalnym.
Monolity to duży zbiór kodu, który musi działać na tej samej maszynie. Mikroserwisy to pojedyncze kawałki kodu, które działają na niezależnych maszynach. Organizacja kodu powinna ten model wspomagać, ale nie oznacza, że każdy moduł musi być niezależny.
Powstaje oczywiście pytanie - dlaczego nie pokusić się o całkowite pozbycie się zależności w kodzie? Odpowiedź - wygoda.
- parent pom.xml pozwala ci na trzymanie wersji zewnętrznych bibliotek w jednym pliku, a nie porozrzucanych w kilku plikach. Przykładowo - używanie różnej wersji kompilatora Apache Avro może zepsuć deploy
- czasami istnieją jakieś domenowe commonsy (np. jakiś egzotyczny encoding/decoding, zestaw klas biznesowych typu Person, Pesel itp. itd.) które warto po prostu mieć w wspólnym module, żeby nie rozsyłać maili typu "wyszły nowe commonsy, zupdate'ujcie się i sprawdźcie, czy nic się nie wysypuje")
- no i na koniec - moduły mogą być całkowicie niezależne, ale jednak połączone pom'em po to, żeby łatwiej się budowało i testowało
Czy to jest dobre podejście? Trudno powiedzieć, bardzo dużo zależy od tego jak powiązane są moduły. Kiedyś nie widziałem w tym problemu, teraz jednak wolę bardziej całkowitą separację, może z wyjątkiem pierwszego punktu.