2009-05-19 12 views
16

Mam dość dużą (kilka MLOC) aplikację pod ręką, którą chciałbym podzielić na więcej możliwych do utrzymania oddzielnych części. Obecnie produkt składa się z około 40 projektów Eclipse, z których wiele ma współzależności. Samo to sprawia, że ​​system ciągłej budowy staje się niewykonalny, ponieważ musiałby się bardzo dużo odbudować za każdym razem.Jak modularyzować (dużą) aplikację Java?

Czy istnieje „najlepsze praktyki” sposób jak

  • zidentyfikować części, które mogą być natychmiast rozdzielone
  • dokumentów wzajemnych zależności wizualnie
  • rozwikłać przepisami kodeksu
  • handle „łaty” musimy zastosować do bibliotek (obecnie obsługiwane przez umieszczenie ich w ścieżce klas przed rzeczywistą biblioteką)

Jeśli istnieją (darmowe/otwarte) narzędzia do obsługi tego, będę wdzięczny za wskazówki.

Mimo że nie mam żadnego doświadczenia z Mavenem, wydaje mi się, że to wymusza bardzo modularną konstrukcję. Zastanawiam się teraz, czy jest to coś, co można zmodernizować iteracyjnie, czy też projekt, który miał go użyć, musiałby od samego początku być rozplanowany na modularność.

Edit 2009-07-10

Jesteśmy w procesie łupania na kilka podstawowych modułów za pomocą Apache Ant/Ivy. Naprawdę pomocne i dobrze zaprojektowane narzędzie, nie nakładające na ciebie tak wiele jak maven.

spisałem kilka bardziej ogólnych szczegóły i osobista opinia o tym, dlaczego to robimy, że na moim blogu - zbyt długo, aby umieścić tu, a może nie interesująca dla każdego, więc postępować według własnego uznania: www.danielschneller.com

+0

Jakiego systemu kompilacji używasz teraz? Jeśli jest to porównanie Ant/Maven, wydaje się bardziej religijnym wyborem niż cokolwiek innego. –

+0

Obecnie używamy mrówki z zestawem dość skomplikowanych skryptów do generowania wszelkiego rodzaju artefaktów.Ale to nigdy nie było kwestią "religii" - to była tylko decyzja podjęta kilka lat temu bez większego porównania. W tamtych czasach rzeczy były oczywiście mniejsze. –

+0

Chciałem tylko powiedzieć, że różnica nie jest tak duża, jak niektórzy mogą to zrobić, więc nie oczekujcie przejścia do Mavena, aby wszystko było łatwiejsze. –

Odpowiedz

8

Korzystanie z OSGi może być dobrym rozwiązaniem dla Ciebie. Pozwoli to na tworzenie modułów poza aplikacją. Możesz także lepiej organizować zależności. Jeśli poprawnie zdefiniujesz interfejsy między różnymi modułami, możesz użyć ciągłej integracji, ponieważ musisz tylko odbudować moduł, którego dotyczyłeś przy odprawie.

Mechanizmy dostarczone przez OSGi pomogą Ci rozplątać istniejący kod. Ze względu na sposób ładowania klas ułatwia to również obsługę łat.

Some concepts of OSGi that seem to be a good match for you, as shown from wikipedia:

ramy są koncepcyjnie podzielone na następujące obszary:

  • Grupy - wiązek zwykłe składniki jar z dodatkowymi nagłówkami oczywisty.
  • Usługi - Warstwa usług łączy pakiety w sposób dynamiczny, oferując model publikowania i odnajdywania dla starych starych obiektów Java (POJO).
  • Rejestr usług - interfejs API usług zarządzania (ServiceRegistration, ServiceTracker i ServiceReference).
  • Cykl życia - interfejs API do zarządzania cyklem życia (pakiety instalowania, uruchamiania, zatrzymywania, aktualizacji i deinstalacji).
  • Moduły - warstwa definiująca enkapsulację i deklarację zależności (w jaki sposób pakiet może importować i eksportować kod).
  • Zabezpieczenia - warstwa, która obsługuje aspekty bezpieczeństwa poprzez ograniczenie funkcji pakowania do predefiniowanych możliwości.
+2

Użyłem już OSGi dla innego projektu, ale od samego początku. Na dłuższą metę jest to prawdopodobnie sposób, w jaki spróbuję. Jednak zmiana środowiska wykonawczego na platformę OSGi nie jest łatwa do zrobienia dzięki aplikacji o tej wielkości. Jednak podjęcie niezbędnych kroków (MANIFEST.MF) jest zdecydowanie czymś, co zwiększa wartość przy niskich kosztach. –

0

I Wouldn polecam Maven dla starszej wersji kodu źródłowego. Może to spowodować wiele bólów głowy po prostu starając się dostosować wszystko do pracy z nim.

Przypuszczam, że potrzebne jest wykonanie układu architektonicznego projektu. Narzędzie może pomóc, ale najważniejszą częścią jest zorganizowanie logicznego widoku modułów.

6

Po pierwsze: powodzenia & Dobra kawa. Będziesz potrzebował obu.

Kiedyś miałem podobny problem. Kod starszego typu ze strasznymi zależnościami cyklicznymi, nawet między klasami z różnych pakietów, takich jak org.example.pkg1.A, zależy od org.example.pk2.B i i odwrotnie.

Zacząłem od projektów maven2 i fresh eclipse. Najpierw spróbowałem zidentyfikować najbardziej powszechne funkcjonalności (warstwa logowania, wspólne interfejsy, wspólne usługi) i stworzone projekty maven. Za każdym razem, gdy byłem zadowolony z części, umieściłem bibliotekę w centralnym repozytorium nexus, tak aby było prawie natychmiast dostępne dla innych projektów.

Więc powoli przeniosłem się przez warstwy. maven2 obsłużyło zależności, a plugin m2eclipse zapewnił pomocny widok zależności. BTW - zwykle nie jest to zbyt trudne do przekształcenia projektu Zaćmienie w projekt maven. m2eclipse może zrobić to za Ciebie i musisz po prostu utworzyć kilka nowych folderów (takich jak src/main/java) i dostosować ścieżkę budowania dla folderów źródłowych. Zajmuje minutę lub dwie. Ale spodziewamy się więcej trudności, jeśli twój projekt jest wtyczką zaćmienia lub aplikacji rcp i chcesz, aby nie tylko zarządzał artefaktami, ale także budował i wdrażał aplikację.

Do opinii, zaćmienie, maven i nexus (lub innych menedżerów repozytorium maven) są dobre podstawy do rozpoczęcia. Masz szczęście, jeśli masz dobrą dokumentację architektury systemu i ta architektura jest naprawdę zaimplementowana;)

3

Miałem podobne doświadczenie w małej bazie kodu (40 kloc).Brak ° zasady ":

  • skompilowany z i bez«module», aby go zobaczyć, to wykorzystanie
  • Zacząłem od«modułów liści», moduły bez innych uzależnień
  • I obsłużonych cykliczny zależności (jest to bardzo zadanie podatne na błędy)
  • z Maven jest wielka sprawa z dokumentacją (raporty), które mogą zostać wdrożone w procesie CI
  • z Maven zawsze można zobaczyć, jakie wykorzystuje co zarówno w strona zarówno w NetBeans (z
    bardzo ładnym reżyserii wykres)
  • z Maven można importować kod biblioteki w swoim kodzie, zastosować poprawki źródłowych i skompilować ze swoimi produktami (czasami jest to bardzo łatwe czasami jest bardzo trudne)

Sprawdź również Zależność Analyzer: http://www.javalobby.org/servlet/JiveServlet/download/17-96956-92153685-7907/screenshot.jpg

Netbeans:

http://dm.zimmer428.net/wp-content/uploads/2009/02/67pre-dependency-graph.jpg

1

Maven jest bolesny do migracji do istniejącego systemu. Jednak bez większych trudności radzi sobie z ponad 100 projektami modułowymi.

1

Pierwszą rzeczą, którą musisz zdecydować, jest infrastruktura, do której się przeniesiesz. Czy powinno to być wiele niezależnie zarządzanych modułów (co przekłada się na poszczególne projekty Eclipse), czy też potraktować to jako pojedynczy fragment kodu, który jest wersjonowany i wdrożony jako całość. Pierwszy jest dobrze przystosowany do migracji do środowiska budowania typu Maven, ponieważ ten cały kod źródłowy znajduje się jednocześnie.

W każdym razie BĘDZIE potrzebny system ciągłej integracji. Twoim pierwszym zadaniem jest automatyczne utworzenie bazy kodu, dzięki czemu Twój system CI będzie mógł obserwować swoje repozytorium źródłowe i odbudowywać je, zmieniając różne rzeczy. Zdecydowałem się na podejście inne niż Maven tutaj i skupiamy się na łatwym środowisku Eclipse, więc stworzyłem środowisko kompilacji przy użyciu plików ant4eclipse i Team ProjectSet (których używamy w każdym razie).

Następnym krokiem będzie pozbycie się zależności cyklicznych - ułatwi to twoją kompilację, pozbędzie się ostrzeżeń Eclipse, a ostatecznie pozwoli ci przejść do etapu "kasy, kompiluj raz, uruchom". To może chwilę potrwać :-(Kiedy przenosisz metody i klasy, nie PRZESUWAJ ich, ale wyodrębnij je lub deleguj i pozostaw ich starą nazwę leżącą w pobliżu i oznacz ją jako przestarzałą, co spowoduje oddzielenie twojego nielubianego od refaktoryzacji i pozwoli na kod " poza”projekt nadal pracować z kodem wewnątrz projektu.

będziesz korzystać z repozytorium źródłowego, który pozwala na przenoszenie plików, a utrzymanie historię. CVS jest bardzo słaby w tym zakresie.

0

to nie jest wolny ale Structure101 da ci tak dobre, jak otrzymasz w zakresie wsparcia narzędzia dla trafienia wszystkich punktów, ale dla zapisu jestem stronniczy, więc możesz również sprawdzić SonarJ i Lattix. ;-)

Powiązane problemy