2014-10-29 4 views
1

я прочитал на "Introduction to Repositories" чтоЧто такое репозиторий Maven?

репозиторий в Maven используется для хранения строить артефакты и зависимости различных типов.

По browsing a remote Maven repository я вижу, что артефакт очевидно каталог удовлетворяющих некоторые ограничения, например, он должен содержать файл с именем maven-metadata.xml и файл с именем <artifactId>-<version>.pom. Оба этих файла имеют некоторую схему и семантику. Я также вижу, что у меня есть «локальный репозиторий» на ~/.m2/repository. Но структура каталогов отличается, например. файлов maven-metadata.xml. Таким образом, удаленный репозиторий и мой локальный репозиторий кодируют одни и те же данные по-разному.

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

Вот догадка ответ:

Хранилище представляет собой карту от GAVS до сборки артефактов. GAV - это тройка (groupId, artifactId, version), где каждый компонент является строкой. A build artifact - карта от filenames до содержание файла.

Хранилище поддерживает две операции: getBuildArtifact, который принимает ВДС и возвращает связанный сборки артефакт если данное Г.А.В. отображается в хранилище; и putBuildArtifact, который отображает предоставленный GAV предоставленному артефакту .

[...]

+0

Почему вы ожидаете ответов, если вы уже сами ответили на свой вопрос. Я не знаю, чего вы хотите ожидать и с какой целью? – khmarbaise

+0

Я * не ответил на вопрос сам. Это предположение, которое нужно исправить и расширить. – jameshfisher

ответ

3

jameshfisher,

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

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

Начнем с удаленных репозиториев. В основном, репозиторий Maven для создания артефактов (банок, войн, молний, ​​poms и т. Д.), Что репозиторий Subversion для исходного кода: хранит его централизованно, чтобы разработчики могли эффективно делиться результатами своей работы таким образом, чтобы обеспечить согласованность, стабильности и прозрачности управления версиями.

Большинство артефактов можно идентифицировать по 3 координатам GAV, таким как org.myproject + mylib + 1.0.

Но иногда одна сборка будет генерировать не только mylib.jar, но и mylib-sources.jar и mylib.zip все в то же время.Затем вам нужно будет пройти в этих дополнительных квалификаторах, чтобы найти эти артефакты.

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

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

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

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

Надеюсь, что это прояснит ситуацию.

+0

Спасибо за ответ. Re API против реализации: это хорошее различие. Просмотрев файловую систему, я пытался «перепроектировать» неявный API, поскольку формальный API не существует. Моя «догадка о ответе» выше - это удар по тому, как может выглядеть описание API. Модель данных будет расширена с помощью таких операций, как 'get: GAV -> Artifact' и' put: (GAV, Artifact) -> void'. С тех пор я нашел «Aether», который претендует на определение API, но он * огромный * и, по-видимому, не определенный Maven. – jameshfisher

+0

Раздел зависимости файла pom.xml действительно является формальным api. Вышеупомянутый ответ на ваш вопрос? – 333kenshin