Java JAR-файлы в хранилище (CVS, SVN ..) - PullRequest
9 голосов
/ 10 января 2011

Почему плохая идея помещать файлы jar Java в репозиторий (CVS, SVN ..)

Ответы [ 5 ]

8 голосов
/ 10 января 2011

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

7 голосов
/ 11 января 2011

Итак, у вас есть проект, который использует некоторые внешние зависимости. Эта зависимость хорошо известна. Все они имеют

  • Группа (обычно организация / кузница, создающая их)
  • Идентификатор (их имя)
  • версия

В терминологии maven эта информация называется координатами артефакта (вашего Jar).

Зависимости, о которых я говорил, являются внутренними (для веб-приложения, это может быть уровень службы / домена) или внешними (log4j, драйвер jdbc, среда Java EE, вы называете это, ...). Все эти зависимости (также называемые артефактами) на самом деле являются на самом низком уровне двоичными файлами (JAR / WAR / EAR), которые ваш CVS / SVN / GIT не сможет эффективно хранить. Действительно, SCM использует гипотезу, что версионный контент, для которого операции diff наиболее эффективны), является только текстовым. Как следствие, когда хранятся двоичные данные, их редко можно оптимизировать для хранения (в отличие от текста, где хранятся только различия версий).

Как следствие, я бы рекомендовал вам использовать систему построения управления зависимостями, такую ​​как maven , Ivy или Gradle . Используя такой инструмент, вы объявите все свои зависимости (фактически, в этом файле вы объявите координаты артефактов ваших зависимостей) в текстовом (или, возможно, XML) файле, который будет в вашем SCM. НО ваши зависимости не будут в SCM. Скорее, каждый разработчик будет загружать их на свой компьютер разработчика.

Это передает некоторую сетевую нагрузку с сервера SCM в Интернет (полоса пропускания которого часто более ограничена, чем внутренняя сеть предприятия) и задает вопрос о долгосрочной доступности артефактов. Оба эти ответа решены (по крайней мере, в работе amven, но я полагаю, что и Ivy, и Gradle могут подключаться к таким инструментам - и, похоже, некоторые вопросы были заданы именно по этой теме) с использованием корпоративных прокси, например Nexus , Артефактория и др.

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

Подводя итог этому длинному ответу: используйте Ivy / Maven / Gradle вместо простой сборки Ant. Эти инструменты позволят вам определить ваши зависимости и выполнить всю работу по загрузке этих зависимостей и гарантировать, что вы используете объявленную версию.

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

4 голосов
/ 11 января 2011

Системы контроля версий предназначены для хранения исходного текста.Они могут содержать двоичные файлы, но это не совсем то, для чего они предназначены.В некоторых случаях имеет смысл поместить бинарный файл в систему контроля версий, но Java-зависимостями, как правило, лучше управлять другим способом.

Идеальная настройка - это такая, которая позволяет вам управлять своими зависимостями вне системы контроля версий.Вы должны иметь возможность управлять своими зависимостями вне источника и просто «указывать» на желаемую зависимость из источника.Это имеет несколько преимуществ:

  • У вас может быть несколько проектов, зависящих от одних и тех же двоичных файлов, без сохранения отдельной копии каждого двоичного файла.Для проектов среднего размера характерны сотни двоичных файлов, от которых зависит.Это может привести к значительному дублированию, что приводит к напрасной трате локальных и резервных ресурсов.
  • Версии двоичных файлов могут управляться централизованно в локальной среде или внутри корпоративного объекта.
  • Во многих ситуацияхСервер управления исходным кодом не является локальным ресурсом.Добавление группы бинарных файлов замедлит процесс, поскольку увеличивает объем данных, которые необходимо отправить по более медленному соединению.
  • Если вы создаете войну, возможно, для разработки понадобятся несколько банок,но не развертывание и наоборот.Хороший инструмент управления зависимостями позволяет легко и эффективно решать эти типы проблем.
  • Если вы зависите от двоичного файла, полученного из другого проекта, он может часто меняться.Это означает, что вы можете постоянно перезаписывать бинарный файл новой версией.Поскольку контроль версий будет хранить каждую копию, он может быстро вырасти до неуправляемого размера, особенно если у вас есть какой-либо тип сценариев непрерывной интеграции или автоматической сборки, создающих эти двоичные файлы.
  • Система управления зависимостями предлагает определенныйуровень гибкости в том, как вы зависите от двоичных файлов.Например, на вашем локальном компьютере вы можете захотеть зависеть от последней версии зависимости, так как она находится в вашей файловой системе.Однако при развертывании приложения вы хотите, чтобы зависимость была упакована в виде файла jar и включена в ваш файл.

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

3 голосов
/ 10 января 2011

Это двоичные файлы:

  • Лучше сослаться на источник, поскольку именно для этого вы используете контроль источника для.
  • Система можетНе говорите, какие различия между файлами
  • Они становятся источником конфликтов слияния, если они скомпилированы из источника в одном и том же хранилище.
  • Некоторые системы (например,SVN) не очень хорошо справляется с большими двоичными файлами.

Другими словами, лучше обращайтесь к источнику и настройте сценарии сборки, чтобы все работало.

2 голосов
/ 10 января 2011

Решение о принятии файлов JAR в SCM обычно зависит от используемого инструмента сборки. Если вы используете Maven обычным способом, у вас нет выбора. Но если ваша система сборки позволяет вам сделать выбор, я думаю, что будет хорошей идеей передать ваши зависимости в SCM вместе с исходным кодом, который зависит от них.

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

При использовании CVS помните, что он не обрабатывает двоичные файлы эффективно. Репозиторий SVN не делает различий между двоичными и текстовыми файлами.

http://svnbook.red -bean.com / о / 1,5 / svn.forcvs.binary-и-trans.html

Обновление в ответ на ответ, оставленный Марком:

WRT bullet point 1: Я бы сказал, что даже для большого проекта не очень часто иметь сотни зависимостей. В любом случае использование диска (сохраняя отдельную копию зависимости в каждом проекте, который его использует) не должно быть вашей главной задачей. Дисковое пространство дешево по сравнению с количеством потерянного времени, связанного со сложностями репозитория Maven. В любом случае, локальный репозиторий Maven будет занимать гораздо больше дискового пространства, чем просто используемые вами зависимости.

Bullet 3: Maven не сэкономит ваше время ожидания сетевого трафика. Противоположность верна. С вашими зависимостями в управлении исходным кодом вы делаете проверку, а затем переключаетесь с одной ветви на другую. Вам очень редко нужно будет снова заказывать те же банки. Если вы это сделаете, это займет всего несколько минут. Основная причина, по которой Maven - это инструмент медленной сборки, заключается во всем доступе к сети, который он делает, даже когда в этом нет необходимости.

Bullet Point 4: Ваша точка зрения здесь не является аргументом против хранения jar-файлов в SCM, а Maven становится легким только после того, как вы его изучили, и он эффективен только до того момента, когда что-то пойдет не так. Тогда это становится трудным, и ваша эффективность может быстро исчезнуть. С точки зрения эффективности, у Maven есть небольшой плюс, когда все работает правильно, и большой недостаток, когда они не работают.

Пункт 5: Системы контроля версий, такие как SVN, не хранят отдельную копию каждой версии каждого файла. Он эффективно хранит их как дельты. Маловероятно, что ваш SVN-репозиторий вырастет до «неуправляемого» размера.

Bullet Point 6: Ваша точка зрения здесь не аргумент против хранения файлов - это SCM. Упомянутый вами вариант использования может быть легко обработан с помощью пользовательской сборки Ant.

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