Mvn install или Mvn package


134

Я новичок в Maven, у меня есть веб-проект на основе Java с maven, настроенным в моем MyEclipse.
Теперь, если я изменил какие-либо java-файлы, мне нужно это делать Run as -> Mvn installили Mvn package?

Ответы:


158

из http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html

package: взять скомпилированный код и упаковать его в распространяемый формат, например, JAR.

install: установить пакет в локальный репозиторий для использования в качестве зависимости в других проектах локально

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


У меня есть проект, в котором я конвертирую код основной папки и код тестовой папки в Jar. Затем я хочу развернуть это в нексусе, чтобы его можно было использовать в других проектах. Моя команда развертывания - «mvn clean deploy -DskipTests». Могу ли я сделать этот пакет команд вместо установки в локальное репо?
MasterJoe

@ MasterJoe2 "Тогда я хочу развернуть это в нексусе" Вот что deployделает. Если вы замените его на package, он не будет развернут в Nexus.
walen

37

mvn install- это вариант, который используется чаще всего.
mvn packageредко используется, только если вы отлаживаете какую-то проблему с процессом сборки maven.

См .: http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

Обратите внимание, что mvn packageбудет создан только файл jar.
mvn installсделает это и установит файлы jar (и классов и т. д.) в нужные места, если от этих jar-файлов зависит другой код.

Я обычно делаю mvn clean install; это удаляет targetкаталог и воссоздает все банки в этом месте.
Очистка помогает избавиться от ненужных или удаленных вещей, которые иногда могут мешать.
Вместо того, чтобы отлаживать (иногда), просто все время начинайте заново.


27
Я не согласен с тем, что пакет редко используется на 2 балла. 1) Он запускается каждый раз, когда вы запускаете установку. 2) Если вы создаете .war, тогда просто запустить пакет в порядке, поскольку вам не нужна война в вашем локальном репо.
Джошуа Уилсон

5
Ответ не объясняет, почему вы предпочитаете установку в локальный репозиторий. Насколько я понимаю, если проекты настроены правильно, то реактор предоставит зависимости между модулями. Если проекты настроены неправильно, то установка может просто скрыть этот факт и использовать неправильные артефакты. Если у вас есть зависимые проекты, которые по какой-то причине должны быть построены отдельно, только тогда вы захотите установить.
Всеволод Голованов

11

Из ссылки Lifecycle , установка будет работать интеграционные тесты проекта, пакет не будет.

Если вам действительно не нужно устанавливать сгенерированные артефакты, используйте хотя бы verify .


5

Также вы должны отметить, что если ваш проект состоит из нескольких модулей, которые зависят друг от друга, вы должны использовать «install» вместо «package», иначе ваша сборка завершится неудачно, потому что, когда вы используете команду install, модуль A будет упакован и развертывается в локальном репозитории, а затем, если модулю B требуется модуль A в качестве зависимости, он может получить к нему доступ из локального репозитория.


4

Если вы не используете удаленный репозиторий (например, artifactory), используйте простой старый: mvn clean install

Довольно старая тема, но AFAIK, если вы запускаете свой собственный репозиторий (например, с artifactory) для совместного использования jar среди вашей команды (групп), вы можете использовать

mvn clean deploy

вместо.

Таким образом, ваш сервер непрерывной интеграции может быть уверен, что все зависимости правильно помещены в ваш удаленный репозиторий. Если вы пропустили один, mvn не сможет найти его в вашем локальном репозитории m2 CI.


1
Я думаю, вы говорите о mvn clean deploy, а не о пакете mvn clean
Mayjak

2

package - берет скомпилированный код и упаковывает его в распространяемый формат, такой как файл JAR или WAR. install - установить пакет в локальный репозиторий для использования в качестве зависимости в других проектах локально


2

Правильный путь , mvn packageесли вы сделали все правильно для основной части вашей сборки , то не должно быть никакой необходимости устанавливать свои пакеты в локальном хранилище.

Кроме того, если вы используете Travis, вы можете «кэшировать» свои зависимости, потому что они не коснутся ваших, $HOME.m2/repositoryесли вы используете пакет для своего собственного проекта.

На практике, если вы даже пытаетесь сделать это, mvn siteвам обычно нужно сделать это mvn installраньше. В любом из них siteлибо слишком много ошибок, либо множество плохо поддерживаемых плагинов.


0

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

Как я уже сказал, это зависит от того, что вы хотите делать.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.