2015-05-09 53 views
5

Mamy duży projekt Java 8 Spring Hibernate Maven, który jest coraz większy.Projekt Java staje się zbyt duży

Problemy:

  • czas budowy wynosi 10-12 minut w najlepszym wypadku; 3 minuty bez testów
  • Mamy już przełącznik wiersza polecenia, który pomija rzadko modyfikowane moduły, co jest symptomem procesu kompilacji osiągającego praktyczne granice.
  • Eclipse walczy z zarządzaniem projektem (chociaż IntelliJ jest w porządku na razie)
  • Sytuacja pogarsza się wraz z rozwojem projektu, a kolejne scenariusze z zespołu testowego zostają zindeksowane jako testy integracyjne w bazie kodu.

Jak pracujemy teraz

  • Projekt jest skonfigurowany w około 20 modułów Maven, tak:
 
    Parent 
    |--- Tier1 
    |--- Tier2 
    |--- WebTier 
     |---- ModuleA 
     |---- ModuleB 
     |---- ModuleC 
     |---- ... 
     |---- Entities 
     |---- Shared 
     |---- Batch 
     |---- IntegrationTests 
  • Aplikacja zbudowana jest w postaci pojedynczej WOJNY
  • Deweloperzy wdrażają pojedynczą warstwę (typicall) y WebTier) jako artefakt od Eclipse lub IntelliJ do lokalnego Tomcata
  • Chociaż projekt wydaje się ładnie podzielony na moduły, istnieje wiele niepożądanych punktów sprzężenia między nimi. Specjalnie w Shared, gdzie moduły wymagające „cross-moduły” dostęp umieścić swoje usługi
  • Wszystkie testy integracyjne są w dedykowanym module (nie wiem dlaczego)

Pomysły zrobić to lepiej

  • Dodaj moduł MessageBroker, aby zezwolić na luźne sprzężenie, jeśli jest to konieczne. Może JMS, lub po prostu głupie składnikiem pamięci dla komunikacji synchronicznej
  • Pozbądź modułu Shared
  • Upewnij się, że moduły mają gruboziarnistych entry-punkty
  • usunąć niepożądane sprzężenia pomiędzy rodzeństwem i wolą brokera wiadomość, gdy możliwe
  • Może zachować Entities. Przynajmniej podmioty core-business (Customer, CustomerFile, ...). Ale niektóre podmioty oczywiście należą do jednego modułu (a Informacje wykonanie partii byłoby w module Batch)

W ten sposób, każdy dokonywania zmian do ModuleA będzie przez większość czasu tylko budować i testy zakończą się w tym module bez obawiając się złamania aplikacji.

Pytania

  • Czy to wydaje się dobry plan?Przez dobro, mam na myśli przyszłość, z dużymi szansami na poprawę rzeczy i nie wymagającą nadmiernej ilości pracy z uwagi na sytuację.
  • Powinniśmy mieć 1 projekt Eclipse/IJ na poziom, niech IDE zbuduje artefakt i wdroży go do Tomcat, czy powinniśmy mieć 1 projekt na moduł i zależności od Nexusa? A może ta druga opcja to przesada?
  • Jakieś inne sugestie?

Niektóre dane

  • Windows 7, Java 8, Maven 3.0.3, TestNG.
  • SSD lub dysk twardy 7200 obr./min (ograniczony wpływ)
  • 6Gb RAM
  • Heap 1GB (Maven)
  • CI z Jenkins

Dzięki kilka!

+0

Wygląda na to, że możesz potrzebować większej sterty lub większej pamięci RAM (lub obu). –

+0

Czy możesz podać trochę więcej informacji o wielkości projektu? Naprawdę tylko 20 modułów maven i trwa 10-13 minut czasu budowania (dźwięki wyjątkowo wolno). Ile testów jest uruchomionych? Jak długo trwają testy? Którą wersję Maven używasz? Ile linii kodu (pomiar przez SonarQube?) Czy korzystasz z rozwiązania CI, takiego jak jenkins? O jakim typie przełącznika linii poleceń mówisz? Czy masz dedykowaną maszynę do kompilacji? Ile pamięci RAM/procesora itp. I jakiego rodzaju dysk twardy ma to urządzenie? Ile pamięci RAM/CPU ma działający komputer stacjonarny? Który system operacyjny? – khmarbaise

+0

@khmarbaise Przełącznik wiersza polecenia jest po prostu '-DskipSomeModules' pasujący do profilu maven, aby pominąć niektóre rzadko używane moduły. Nic specjalnego tutaj, tylko dziwactwo, które pokazuje, że nie robimy tego właściwie IMO. Mamy CI z Jenkinsem, ale wydaje się to nieistotne: jest to lokalna kompilacja dev, która boli, i można to zrobić tylko przez zbudowanie pełnej WAR z powodu częstego sprzężenia. Wrócę do ciebie z żądanymi informacjami jutro. Dziękuję Ci. – youri

Odpowiedz

1

CI byłaby prawdziwą odpowiedzią, ale wygląda na to, że projekt nie jest modułowy, jak powinien. Nie budujesz całego projektu od początku za każdym razem. Budujesz słoiki, testujesz je w różnych projektach i używasz jako pojedynczych przedmiotów. Każdy projekt powinien być wystarczająco mały i obejmować tylko jeden obszar. Czy myślisz, że Java buduje powiedzmy słoiki bezpieczeństwa, gdy pracują na pakiecie io? Dziel i rządź - to cała idea OOP i enkapsulacji.

+0

Nie tak modularny jak się wydaje na pewno, stąd mój pytanie, jak mogę to poprawić. Muszę przekonać moich kolegów z drużyny, że obecna sytuacja jest bolesna i zaszkodzi zespołowi na dłuższą metę, i że możemy polegać na planie i ufać, że wysiłek refaktoryzacji będzie warty tego. – youri

+0

To jest pytanie bardziej architektoniczne, na które nie można odpowiedzieć bez pełnych analiz. Przynajmniej narysuj diagram klasowy i zobacz, jakie są połączenia. – Alex

0

To może nie być tak źle, jak myślisz. Zaangażowane projekty z testami jednostkowymi i analizą statyczną wymagają czasu.

Firma, w której pracowałem, miała> 1 godz. Kompilacji + czasy integracji unitTest + CodeCoverage. To nie liczy czasu potrzebnego na wysłanie artefaktu do vSphere w celu automatycznego testowania kliknięcia instalatora na obsługiwanych systemach 26 języków x 8.

+0

Nie mam nic przeciwko 10 'dla kompletnej kompilacji per se. Problem polega na tym, że musimy to robić za każdym razem, gdy dokonamy jednej zmiany. Jeśli modyfikuję rzeczy tylko w ModuleX, mam nadzieję, że nie będę musiał się martwić modułem A lub modułem B.Nigdy nie jesteśmy pewni, że nie zepsujemy niczego niezwiązanego. W rzeczywistości jest odwrotnie. Pod koniec dnia te 10 minut się sumuje. Jednak wspólne moduły zawsze wymagają pełnej kompilacji. – youri

+0

Rozważ skonfigurowanie sparametryzowanych zadań kompilacji w Jenkins, abyś mógł powiedzieć skryptowi budowania, aby zbudował "moduł A" na żądanie, a następnie mieć godzinowe wersje cron dla pełnych kompilacji systemu. Rozwiązałoby to problem dewelopera, który chciałby, aby moduł ModuleA został natychmiast zbudowany i przetestowany, a także potrzeba obsługi kompilacji pełnej integracji do regresji i kompletnych testów jednostkowych. Możesz również mieć oddzielny cel ant/msbuild (lub cokolwiek, co używasz) w tym samym zadaniu Jenkinsa, które będzie budować i testować jednostki tylko ten moduł na żądanie, który przekazuje parametr zadania Jenkins do skryptu kompilacji. – JasonRobinson

Powiązane problemy