Организация Java-проектов - PullRequest
       30

Организация Java-проектов

7 голосов
/ 25 декабря 2009

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

Проблема в том, что они не в полной мере используют все доступные инструменты (контроль версий, автоматическое построение, непрерывная интеграция и т. Д.): В основном проект - это один большой проект в eclipse / netbeans, использующий cvs для контроля версий и все проверено (включая библиотечные jar-файлы), они впервые начали использовать ветвление, когда я начал делать ветки для небольших задач и объединять их обратно. По мере того как проекты становятся все больше и сложнее, возникают проблемы с зависимостями, структурой проекта, связанной с IDE, сборкой иногда может быть PITA и т. Д. В лучшем случае это беспокойство.

Я хочу создать среду разработки, в которой большинство этих проблем исчезнет, ​​а я сэкономлю время и усилия. Я хотел бы настроить проекты независимо от IDE, используемой с использованием контроля версий (я сейчас склоняюсь к SVN), избегать путаницы зависимостей и максимально автоматизировать сборку.

Я знаю, что для этого есть несколько подходов и инструментов, и я не хочу, чтобы началась священная война, я был бы очень признателен за практические рекомендации, основанные на опыте и за то, что вы сочли полезным для решения подобных проблем. Все проекты являются Java-проектами и варьируются от веб-приложений до «универсальных», и я большую часть времени использую Eclipse, но при необходимости также использую Netbeans. Заранее спасибо.

Ответы [ 10 ]

18 голосов
/ 25 декабря 2009

Вы, кажется, почти в той точке, в которой я работал там, когда я начал там 1,5 года назад, с той лишь разницей, что вы начали играть с ветками, что на самом деле мы все еще не делаем на моей работе, но об этом позже в этом ответе.

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

Системы контроля версий

Чаще всего небольшие компании в настоящее время используют CVS или SVN, и в этом нет ничего плохого, на самом деле я был бы очень обеспокоен, если бы вообще не использовался контроль версий. Тем не менее, вы должны использовать контроль версий right , просто один из них не сделает вашу жизнь проще. В настоящее время мы используем CVS и изучаем Mercurial , но мы обнаружили, что следующее работает как хороший набор соглашений при работе с CVS (и я подозреваю, что SVN тоже):

  • Иметь отдельных пользователей для всех коммиттеров. Ценно знать, кто что совершил.
  • Не разрешать пустые коммиты. Фактически, если возможно, настройте репозиторий так, чтобы он отклонял любые коммиты без комментариев и / или комментариев по умолчанию. Первоначальная фиксация для FooBarizer лучше, чем Пустое сообщение журнала
  • Используйте теги для обозначения вех, прототипов, альфа-версий, бета-версий, релиз-кандидатов и финальных версий. Не используйте теги для экспериментальной работы или в качестве сносок / Post-It notes .
  • Не используйте ветки, так как они действительно не работают, если вы продолжаете разрабатывать приложение. Это происходит главным образом потому, что в CVS и SVN ветвление просто не работает должным образом, и становится бесполезным упражнением поддерживать более двух живых ветвей ( головка и любая вторичная ветвь ) с течением времени.

Всегда помните, что для компании-разработчика программного обеспечения исходный код является вашим источником дохода и содержит всю ценность вашего бизнеса, поэтому относитесь к этому так. Также, если у вас есть дополнительные 70 минут, я очень рекомендую вам посмотреть через этот доклад , который Линус Торвальдс дал в Google о git и (d) VCS в целом, это действительно проницательно.

Автоматизированные сборки и среды непрерывной интеграции

Они примерно одинаковы на самом деле. Ежедневные сборки - это PR-шутка, мало похожая на состояние реального программного обеспечения, за исключением некоторого очень элементарного "Компилируется ли оно?" проблемы. Вы можете скомпилировать много ужасного шума кода, который ничего не делает, поддержание качества программного обеспечения не имеет ничего общего с получением кода для компиляции.

С другой стороны, модульные тесты являются отличным способом поддержания качества программного обеспечения, и я с некоторой личной гордостью могу сказать, что тщательное модульное тестирование помогает даже худшим из программистов улучшать свои показатели и выявлять глупые ошибки. На самом деле до сих пор было всего три ошибки, написанные мною написанным кодом, достигли производственной среды, и я бы сказал, что через 18 месяцев это чертовски хорошее достижение. В нашем новом производственном коде у нас обычно есть инструкция охват кода , равная + 80%, в основном + 90%, а в одном особом случае - до 98%. Эта часть очень интересна, и вам лучше использовать Google: TDD, BDD, модульные тесты, интеграционные тесты, приемочные тесты, xUnit, фиктивные объекты.

Это длинное предисловие, я знаю. Фактический смысл всего вышеперечисленного заключается в следующем: если вы хотите иметь автоматические сборки, они должны происходить каждый раз, когда кто-то фиксирует, и следить за тем, чтобы постоянно увеличивалось и улучшалось количество модульных тестов для производственного кода. Выберите систему непрерывной интеграции по вашему выбору (мы используем Hudson CI ), чтобы запустить все модульные тесты, связанные с проектом, и принимать сборки только в том случае, если все тесты пройдены. Не идите на компромиссы! Если модульные тесты показывают, что программное обеспечение не работает, исправьте его.

Кроме того, системы непрерывной интеграции предназначены не только для компиляции кода, но вместо этого их следует использовать для отслеживания состояния метрик программного проекта. Для Hudson CI я могу порекомендовать все эти плагины:

  • Checkstyle - Проверяет, написан ли фактический исходный код заданным вами способом. Большая часть написания поддерживаемого кода заключается в использовании общих соглашений.
  • Cobertura - Кодовые показатели покрытия, очень полезные для наблюдения за развитием покрытия с течением времени. Кроме того, следуя менталитету «источник - Бог», вы можете отказаться от билдов, если охват падает ниже определенного уровня.
  • Task Scanner - Простой, но приятный: Сканирует для определенных тегов, таких как BUG, ​​TODO, NOTE и т. Д. В вашем коде, и создает список из них для всех, чтобы прочитать. Простой способ отследить короткие заметки или известные ошибки, которые нужно исправить или что угодно, что вы можете придумать.

Структура проекта и управление зависимостями

Это спорный вопрос. В принципе, все согласны с тем, что наличие единой структуры - это замечательно, но поскольку есть несколько лагерей с различными требованиями, привычками и взглядами, которые они могут выдавать, они склонны не соглашаться. Например, люди Maven действительно верят, что есть только один способ - способ Maven - что-то делать, и это все, в то время как сторонники Ivy считают, что структура проекта не должна быть забита в ваше горло внешними сторонами, только необходимо правильно и единообразно управлять зависимостями. Только то, что это не осталось неясным, наша компания просто любит Плющ.

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

Вначале мы использовали отдельные проекты для реального программного обеспечения и связанных тестов (обычно называемые Product и Product_TEST). Это очень близко к тому, что у вас есть, один огромный каталог для всего с зависимостями в виде JAR, непосредственно включенных в каталог. Что мы сделали, так это то, что мы извлекли оба проекта из CVS, а затем связали реальный проект с тестовым программным проектом в Eclipse как зависимость времени выполнения. Немного неуклюже, но это сработало.

Вскоре мы поняли, что эти дополнительные шаги совершенно бесполезны, поскольку, используя Ant - кстати, вы можете вызывать задачи Ant непосредственно в Hudson - мы могли бы сказать шагу сборки JAR / WAR игнорировать все по имени файла (скажем, все, что заканчивается Test или TestCase) или по исходной папке. Довольно скоро мы преобразовали наш программный проект для использования простой структуры двух корневых папок src и test. С тех пор мы не оглядывались назад. Единственная дискуссия, которую мы в настоящее время ведем, это то, что мы должны допустить, чтобы в нашей стандартной структуре проекта существовала третья папка с именем spikes, и это не очень жаркая дискуссия.

Это сработало очень хорошо и не требует никакой дополнительной поддержки или плагинов ни от одной из IDE, что является большим плюсом - причина номер два, по которой мы не выбрали Maven, видела, как M2Eclipse в основном взял на себя затмение. И поскольку вы, должно быть, задаетесь вопросом, причиной номер один для отказа от Maven была неуклюжесть самого Maven, бесконечное количество длинных XML-объявлений для конфигурации и связанная с этим кривая обучения считались слишком большими затратами на то, что мы получим от его использования.

Довольно интересно, что позднее комментирование с Ivy вместо Maven позволило нам плавно перейти к разработке Grails , которая использует имена папок и классов в качестве соглашений практически для всего при структурировании веб-приложения.

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

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

Заключительные слова

Пока у вас менее 10 человек, ориентированных на код, вы обладаете всей гибкостью, необходимой для принятия важных решений. Когда вы выходите за рамки этого, вы должны жить с любым выбором, который вы сделали, независимо от того, насколько он хорош или плох. Не просто верьте вещам, которые вы слышите в Интернете, садитесь и строго проверяйте все - черт возьми, наш старший технический специалист даже написал свою дипломную работу бакалавра о веб-фреймворках Java, просто чтобы выяснить, какой из них нам следует использовать, - и действительно выяснить, что вы очень нужно. Не соглашайтесь ни на что, просто потому, что вам могут понадобиться некоторые функции, которые он предоставляет в отдаленном будущем, выберите те вещи, которые оказывают минимально возможное негативное влияние на всю компанию. Будучи 10-м человеком, нанятым в компанию, в которой я работаю, я могу подписать все в этом параграфе своей собственной кровью, в настоящее время у нас работает более 16 человек, и изменение некоторых соглашений на самом деле будет немного страшным.

8 голосов
/ 25 декабря 2009

Наш стек разработки (команда из 10+ разработчиков)

  • Eclipse IDE с M2Eclipse и Subclipse / Subversive
  • Subversion для управления исходным кодом, некоторые разработчики также используют TortoiseSVN, где Subclipse завершается ошибкой
  • Maven 2 для конфигурации проекта (зависимости, плагины сборки) и выпуска mgmt (автоматическая пометка выпусков)
  • Хадсон для непрерывной интеграции (создает также моментальные снимки с исходными вложениями и отчетами)
  • Archiva для хранилища артефактов (несколько хранилищ, например, выпуски и снимки разделены)
  • Сонар для отслеживания качества кода (например, точек доступа, покрытия, соблюдения правил кодирования)
  • JIRA для отслеживания ошибок
  • Слияние для разработчиков вики и общения технических документов с другими отделами
  • Docbook для руководств (встроен в сборку)
  • JMeter для стресс-тестирования и долгосрочного мониторинга производительности
  • Selenium / WebDriver для автоматизированных интеграционных тестов браузера
  • Jetty, Tomcat, Weblogic и Websphere в качестве тестовых сред для веб-приложений. Продукты развертываются каждую ночь, а автоматизированные тесты выполняются на распределенных серверах Hudsons.
  • Список рассылки со всеми разработчиками для объявлений, общих сообщений электронной почты
  • Ежедневные встречи на ногах , где кто-нибудь рассказывает о том, что он в данный момент делает

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

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

4 голосов
/ 25 декабря 2009

Прекрасный, замечательный инстинкт. Слава тебе.

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

Я сам не использовал CVS, поэтому не могу сказать, насколько хорошо он поддерживает эти методы. Я укажу, что Subversion и Git будут лучшим выбором. В худшем случае вам следует прочитать книгу Subversion " red bean ", чтобы получить общие советы по управлению исходным кодом.

Лично я не фанат Maven. Я считаю, что это слишком тяжеловес, особенно по сравнению с Муравьем и Айви. Я бы сказал, что их использование с круиз-контролем может решить многие ваши проблемы.

Вы не упомянули юнит-тестирование. Начните создавать тесты TestNG и Fit в свой цикл сборки.

Посмотрите на IntelliJ - я думаю, что он лучше IDE, чем Eclipse или NetBeans, но это только я.

Удачи.

2 голосов
/ 25 декабря 2009

Maven великолепен, однако, он может иметь небольшую кривую обучения и требует, чтобы проект соответствовал очень специфической файловой структуре. Если у вас большой унаследованный проект, вам может быть сложно его придумать. В этом случае Ant + Ivy сделает то же самое без строгих требований, предъявляемых к maven.

Для автоматизации сборки, Hudson превосходен. Я использовал несколько разных систем, но это, безусловно, самый простой способ настройки и администрирования.

1 голос
/ 07 июня 2012

Много полезных советов здесь. У меня есть только несколько дополнений:

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

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

Я бы посоветовал вводить инструменты по одному. Если вы попытаетесь механизировать все аспекты разработки программного обеспечения в магазине ручной работы одним махом, то, скорее всего, будет существенное сопротивление. Составьте свое экономическое обоснование и получите согласие на один хороший общий инструмент или просто получите разрешение на его настройку для вашего использования, но общедоступным способом, и пусть люди видят, что он делает для вас. После нескольких из них у людей появится привычка задаваться вопросом, как можно автоматизировать аспект X, поэтому проще будет внедрить дополнительные инструменты.

1 голос
/ 28 декабря 2009

Вот то, что я сейчас использую, но я, вероятно, переключу несколько частей (см. Конец этого поста).

Eclipse как IDE с несколькими плагинами: JADClipse (для декомпиляции .class на лету, довольно полезно), DBViewer для быстрого доступа к базе данных через Eclipse WTP (Платформа веб-инструментов), интегрированная в Eclipse для запуска Tomcat 6 в качестве веб-сервера разработки (довольно быстро), Mylyn (связана с ошибкой JIRA -tracker).

Мне слишком интересно узнать о "независимых проектах IDE", сейчас мы все придерживаемся Eclipse - файлы проектов Eclipse (.project, .classpath, .settings) даже фиксируются в репозитории CVS (для того, чтобы иметь проект полностью готов после проверки) - но с Netbeans, поддерживаемым Sun и работающим все быстрее и быстрее с каждым выпуском (и каждой новой версией JRE), вопрос не закрыт.

CVS для хранения проектов, почти без веток (только для исправлений).

Я работаю над производством среды с Oracle SGBDR , но я использую HSQLDB на своем компьютере для разработки, чтобы ускорить процесс тестирования, сборки и разработки (с помощью инструмент с открытым исходным кодом DDLUtils для упрощения создания базы данных и внедрения данных). В противном случае я использую SQLWorkbench для быстрых задач BD (включая сравнение схем) или Oracle (бесплатно) SQLDeveloper для некоторых специфических задач Oracle (таких как блокировка сессий и т. Д.).

Тесты - это только JUnit тесты (либо простые модульные тесты, либо более сложные тесты (почти "интеграционные"), почти всегда выполняющиеся на HSQLDB для более быстрой работы.

Моя система сборки Ant (запущена из Eclipse) для различных небольших задач (например, загрузка войны на удаленный сервер) и (в основном) Maven 2 для:

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

Внешний интерфейс для непрерывной интеграции - Luntbuild , а внешний интерфейс для хранилища Maven - Archiva .

Все это работает. Но я очень разочарован несколькими элементами этой экосистемы.

В основном, Maven, это слишком много времени, и у меня много горя по сравнению с этим инструментом. Разрешение конфликтов - шутка. Много строк XML в каждом файле POM.xml, избыточных в каждом проекте (даже с помощью нескольких корней POM). Плагины слишком непоследовательны, содержат ошибки, и действительно трудно найти четкую документацию, объясняющую, что необходимо настроить, и т. Д.

Так что мне интересно переключиться с Maven на ANT + Ivy . Для того, что я видел до сих пор, это выглядит довольно круто (существуют различные диспетчера конфликтов для разрешения конфликтов зависимостей, и вы даже можете написать свой собственный диспетчер конфликтов), нет необходимости устанавливать и настраивать дополнительный инструмент (как ANT изначально работает под Eclipse, в то время как Maven нужен отдельный плагин - я, кстати, попробовал 3 плагина Mavens и обнаружил, что все три из них глючат).

Однако Maven 3 уже в пути, я попробую, но не ожидаю, что он будет принципиально отличаться от Maven 2.

Hudson может показаться лучшим выбором, чем Luntbuild, но пока эта часть не будет изменена.

И Subversion , вероятно, заменит CVS в ближайшем будущем (даже если у меня почти нет проблем с CVS).

1 голос
/ 25 декабря 2009

Для управления проектами и хранилищами я использую trac с subversion .

1 голос
/ 25 декабря 2009

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

1 голос
/ 25 декабря 2009

Я рекомендую использовать Maven для построения ваших проектов. Использование значения Maven brigns для проекта, потому что:

  • Maven продвигает соглашение о конфигурации , что соответствует хорошей структуре проекта
  • благодаря плагинам Maven облегчает создание проектов для IDE (Eclipse, Netbeans, Idea)
  • обрабатывает все зависимости и завершает жизненный цикл сборки
  • модульные проекты вспомогательных проектов (через многомодульные проекты)
  • помогает с бременем релизов / версий
  • улучшение качества кода - простая интеграция с серверами непрерывной интеграции и множество плагинов для качества кода
0 голосов
/ 25 июня 2010

Самое лучшее, что вы можете сделать, не мешая другим людям и их способам работы, - это настроить Hudson для просмотра репозитория CVS для каждого вашего проекта. Просто сделав это, вы получите центральное место для просмотра сообщений cvs commit.

Следующим шагом будет компиляция этих проектов под Hudson. Для Eclipse это обычно означает либо переход на ant, либо, как мы это сделали, использование ant4eclipse для моделирования существующего процесса сборки eclipse. Не легко, но очень стоит. Не забывайте рассылать письма, когда сборка прерывается - это чрезвычайно важно. Ant4eclipse требует наборов командных проектов - внедрение их в вашу организацию. Ваши коллеги будут счастливы в следующий раз, когда им потребуется создать новое рабочее пространство.

Если у вас возникла ситуация, когда ваш материал собирается должным образом, когда кто-то вносит изменения, подумайте о том, чтобы сделать автоматически созданный код кодом, который будет фактически передан заказчику. Поскольку он был построен на сервере сборки, а не на компьютере разработчика, вы знаете , что вы можете воспроизвести сборку. Это неоценимо в ситуации «исправь эту древнюю версию».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...