Подтвердить что ты не робот

Как модулировать (большое) приложение Java?

У меня есть довольно большое (несколько MLOC) приложение, которое я хотел бы разделить на более ремонтные части. В настоящее время продукт включает около 40 проектов Eclipse, многие из которых имеют взаимозависимости. Это само по себе делает непрерывную систему сборки неосуществимой, потому что она должна будет очень сильно перестраиваться с каждой проверкой.

Есть ли способ "наилучшей практики" как

  • идентифицировать части, которые могут быть немедленно разделены.
  • визуальные визуализации документов
  • распутать существующий код
  • обрабатывать "патчи", мы должны обращаться к библиотекам (в настоящее время они обрабатываются путем помещения их в путь к классам до фактической библиотеки)

Если есть (бесплатные/открытые) инструменты для поддержки этого, я буду признателен за указатели.

Несмотря на то, что у меня нет опыта с Maven, похоже, что он очень модульный. Интересно, будет ли это то, что может быть модифицировано итеративно или если проект, который должен был его использовать, должен был быть составлен с учетом модульности с самого начала.

Редактировать 2009-07-10

Мы находимся в процессе разделения некоторых основных модулей, используя Apache Ant/Ivy. Действительно полезный и хорошо продуманный инструмент, не навязывая вам столько же, как и maven.

Я записал несколько общих деталей и личное мнение о том, почему мы делаем это в своем блоге - слишком долго, чтобы публиковать здесь и, возможно, не интересно всем, поэтому следуйте по своему усмотрению: www.danielschneller.com

4b9b3361

Ответ 1

Использование OSGi может пригодиться вам. Это позволит создавать модули из приложения. Вы также можете организовать зависимости в лучшем виде. Если вы правильно определяете свои интерфейсы между различными модулями, вы можете использовать непрерывную интеграцию, поскольку вам нужно только восстановить модуль, который вы затронули при регистрации.

Механизмы, предоставляемые OSGi, помогут вам распутать существующий код. Из-за того, как работает классная загрузка, он также помогает вам легче обрабатывать патчи.

Некоторые концепции OSGi, которые кажутся вам подходящими, как показано из Википедии:

Структура концептуально разделена на следующие области:

  • Связки - Связки - это обычные компоненты jar с дополнительными манифестными заголовками.
  • Сервисы. Уровень сервиса соединяет динамические пакеты, предлагая модель публикации-find-bind для простых старых Java-объектов (POJO).
  • Реестр служб - API для служб управления (ServiceRegistration, ServiceTracker и ServiceReference).
  • Life-Cycle - API для управления жизненным циклом (установка, запуск, остановка, обновление и удаление пакетов).
  • Модули - слой, который определяет инкапсуляцию и объявление зависимостей (как пакет может импортировать и экспортировать код).
  • Безопасность. Уровень, который обрабатывает аспекты безопасности, ограничивая функциональность пакета до заранее определенных возможностей.

Ответ 2

Во-первых: удачи и хорошего кофе. Вам понадобятся оба.

У меня когда-то была подобная проблема. Устаревший код с ужасными круговыми зависимостями, даже между классами из разных пакетов, таких как org.example.pkg1.A, зависит от org.example.pk2.B и наоборот.

Я начал с maven2 и свежих проектов затмения. Сначала я попытался определить наиболее распространенные функции (уровень регистрации, общие интерфейсы, общие службы) и создал проекты maven. Каждый раз, когда я был доволен частью, я развернул библиотеку в центральный репозиторий nexus, чтобы он почти сразу был доступен для других проектов.

Итак, я медленно работал над слоями. maven2 обрабатывал зависимости, а плагин m2eclipse - полезное представление зависимости. BTW - обычно не так сложно преобразовать проект eclipse в проект maven. m2eclipse может сделать это за вас, и вам просто нужно создать несколько новых папок (например, src/main/java) и настроить путь сборки для исходных папок. Проходит всего минуту или две. Но ожидайте больше трудностей, если ваш проект - плагин eclipse или приложение rcp, и вы хотите, чтобы maven не только управлял артефактами, но также создавал и развертывал приложение.

К мнению, затмение, maven и nexus (или любой другой менеджер хранилища maven) являются хорошей основой для начала. Вам повезло, если у вас есть хорошая документация по системной архитектуре и, эта архитектура действительно реализована;)

Ответ 3

У меня был аналогичный опыт в небольшой кодовой базе (40 kloc). Нет правил °:

  • скомпилирован с и без "модуля", чтобы увидеть его использование
  • Я начал с "листовых модулей", модулей без других зависимостей
  • Я обрабатывал циклические зависимости (это очень сложная задача)
  • с maven существует много документации (отчетов), которая может быть развернута в процессе CI
  • с maven вы всегда можете увидеть, что использует то, что на сайте как в netbeans (с помощью очень хороший направленный график)
  • с maven вы можете импортировать код библиотеки в свою кодовую базу, применять исходные исправления и скомпилируйте свои продукты (иногда это очень просто, иногда это очень трудный)

Проверьте также анализатор зависимостей: 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

Ответ 4

Maven болезнен для перехода на существующую систему. Однако он может без проблем справляться с более 100 проектами модулей.

Ответ 5

Первое, что вам нужно решить, - это то, к какой инфраструктуре вы перейдете. Должно быть много поддерживаемых модулей (что переводится в отдельные проекты Eclipse), или вы считаете это единым блоком кода, который версируется и развертывается в целом. Первый из них хорошо подходит для перехода на среду Maven, например, для сборки, причем последняя предназначена для всего исходного кода.

В любом случае вам понадобится система непрерывной интеграции. Ваша первая задача - автоматически создать базу кода, чтобы вы могли позволить вашей системе CI наблюдать за вашим исходным репозиторием и перестраивать его, когда вы меняете вещи. Я решил использовать не-Maven подход, и мы сосредоточимся на том, чтобы иметь легкую среду Eclipse, поэтому я создал среду сборки, используя файлы ant4eclipse и Team ProjectSet (которые мы используем в любом случае).

Следующим шагом будет избавление от круговых зависимостей - это упростит вашу сборку, избавится от предупреждений Eclipse и, в конечном итоге, позволит вам перейти на этап "checkout, compile once, run". Это может занять некоторое время:-( Когда вы переносите методы и классы, не перемещайте их, а извлекайте или делегируйте их и оставляйте их старое имя лежащим и отмечайте их устаревшими. Это отделит ваш untangeling с вашим рефакторингом и разрешит код "вне" вашего проекта, чтобы по-прежнему работать с кодом внутри вашего проекта.

Вы получите выгоду от исходного репозитория, который позволяет перемещать файлы и сохранять историю. В этом отношении CVS очень слаб.

Ответ 6

Я бы не рекомендовал Maven для устаревшей исходной кодовой базы. Это может дать вам много головных болей, просто пытаясь приспособить все, чтобы работать с ним.

Я предполагаю, что вам нужно сделать архитектурный макет вашего проекта. Инструмент может помочь, но наиболее важной частью является организация логического представления модулей.

Ответ 7

Это не бесплатно, но Structure101 даст вам так же хорошо, как вы получите с точки зрения поддержки инструмента для удара по всем вашим маркам, Но для записи я предвзятый, поэтому вы можете проверить SonarJ и Lattix тоже.; -)