2015-05-09 2 views
5

У нас большой проект Java 8 Spring Hibernate Maven, который становится все больше.Java-проект становится слишком большим

Проблемы:

  • время сборки составляет 10-12 минут в лучшем случае; 3 минуты без тестов
  • У нас уже есть переключатель командной строки, чтобы пропускать редко модифицированные модули, что является симптомом процесса сборки, достигающим практических пределов.
  • Eclipse пытается управлять проектом (хотя IntelliJ в порядке)
  • Вещи ухудшаются по мере роста проекта, и по мере того как больше сценариев из тестовой команды получают в качестве интеграционных тестов в базе кода.

Как мы работаем в настоящее время

  • Проект выполнен в около 20 модулей Maven, например, так:
 
    Parent 
    |--- Tier1 
    |--- Tier2 
    |--- WebTier 
     |---- ModuleA 
     |---- ModuleB 
     |---- ModuleC 
     |---- ... 
     |---- Entities 
     |---- Shared 
     |---- Batch 
     |---- IntegrationTests 
  • Приложение построено как единая ВОЙНЫ
  • Разработчики развертывают единый уровень (typicall y WebTier) как артефакт от Eclipse или IntelliJ к их местному Tomcat
  • Хотя проект кажется красиво разделенным в модулях, между ними есть много нежелательных точек соединения. Специально в Shared, где модули, нуждающиеся в «кросс-модули» доступ положить свои услуги
  • Все интеграционные тесты находятся в специальном модуле (не знаю, почему)

Идеи, чтобы сделать его лучше

  • Добавить модуль MessageBroker, чтобы обеспечить свободное соединение, если это необходимо. Может быть, JMS, или просто тупой компонент в памяти для синхронной связи
  • Избавиться от Shared модуля
  • Убедитесь, что модули имеют крупнозернистый начальный точки
  • Удалить нежелательную связь между братьями и сестрами и предпочитают сообщение брокер когда возможно
  • Возможно сохранение Entities. По крайней мере, основные компании (Customer, CustomerFile, ...). Но некоторые сущности, очевидно, принадлежат к одному модулю (а информация исполнения партии будет в Batch модуле)

Таким образом, любой желающий сделать изменения в ModuleA бы большую часть времени только строить и запускать тесты в этом модуле без опасаясь разорвать заявку.

Вопросы

  • ли это, кажется, как хороший план?К счастью, я имею в виду будущие доказательства с хорошими шансами улучшить ситуацию и не требуя чрезмерного объема работы, учитывая ситуацию.
  • Если у нас есть 1 проект Eclipse/IJ на уровне, дайте IDE построить артефакт и развернуть его для Tomcat, или у нас есть 1 проект на модуль и зависимости от Nexus? Или, может быть, последний вариант является излишним?
  • Любые другие предложения?

Некоторые показатели

  • для Windows 7, Java 8, Maven 3.0.3, TestNG.
  • SSD или HDD 7200rpm (ограниченное воздействие)
  • 6Gb RAM
  • Heap 1Gb (специалист)
  • CI с Дженкинс

Благодаря кучу!

+0

Похоже, вам может понадобиться большая куча или больше ОЗУ (или и то и другое). –

+0

Можете ли вы дать немного больше информации о размере проекта? На самом деле всего 20 модулей maven и время сборки 10-13 минут (звучит крайне медленно). Сколько тестов выполняется? Как долго проходят тесты? Какую версию Maven вы используете? Сколько строк кода (измерение SonarQube?) Вы используете решение CI, например, jenkins? О каком переключателе командной строки вы говорите? У вас есть специальная машина для сборки? Сколько RAM/CPU и т. Д. И какой жесткий диск имеет этот аппарат? Сколько RAM/CPU имеет рабочая станция? Какая операционная система? – khmarbaise

+0

@khmarbaise Переключатель командной строки - это «-DskipSomeModules», соответствующий профилю maven, чтобы пропустить некоторые из редко используемых модулей. Ничего особенного здесь, просто причуда, которая показывает, что мы не делаем это правильно ИМО. У нас есть CI с Дженкинсом, но здесь это не имеет значения: это болит местный разработчик, и это может быть сделано только путем создания полной WAR из-за частых связей. Вернемся к вам с запрошенной информацией завтра. Спасибо. – youri

ответ

1

CI был бы реальным ответом, но, похоже, ваш проект не является модульным, как и должно быть. Каждый раз вы не строите весь проект с нуля. Вы строите банки, проверяете их в разных проектах, а затем используете как отдельные элементы. Каждый проект должен быть достаточно маленьким и охватывать только одну область. Считаете ли вы, что Java-сборки, скажем, банки безопасности, когда они работают с пакетом io? Разделите и победите - вот и вся идея ООП и инкапсуляция.

+0

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

+0

Это более архитектурный вопрос, на который нельзя ответить без полного анализа. По крайней мере, нарисуйте диаграмму классов и посмотрите, какие соединения есть. – Alex

0

Это может быть не так плохо, как вы думаете. Вложенные проекты с модульными тестами и статическим анализом занимают некоторое время.

Компания, в которой я работал, имела> 1hr build + unitTest + CodeCoverage. Это не учитывает время, необходимое для отправки артефакта в vSphere для автоматического тестирования сквозного тестирования установщика на 26 языках, поддерживаемых операционными системами x 8.

+0

Я не против 10 'для полной сборки как таковой. Беда в том, что мы должны делать это каждый раз, когда мы делаем одно изменение. Если я модифицирую только модули ModuleX, надеюсь, мне не придется беспокоиться о ModuleA или ModuleB.Мы никогда не уверены, что мы не будем нарушать ничего несвязанного. На самом деле все наоборот. В конце дня эти 10 минут складываются. Однако общие модули всегда требуют полной сборки. – youri

+0

Рассмотрите возможность настройки параметризованных заданий сборки в Jenkins, чтобы вы могли сказать сценарию сборки, чтобы построить модуль «A» по требованию, а затем ежечасные сборки cron для полных системных сборок. Это решит проблему того, что разработчик, нуждающийся в ModuleA, будет немедленно создан и протестирован, а также необходимость поддержки полных интеграционных сборок для регрессионных и полных модульных тестов. У вас также может быть отдельная цель ant/msbuild (или то, что вы используете) в том же задании Jenkins, которое будет строить и тестировать модуль только по запросу, который передает параметр Jenkins Job скрипту сборки. – JasonRobinson

Смежные вопросы