Maven, кажется, является одной из тех тем, которая вызывает страсть у многих разработчиков. В этой серии статей я хочу взглянуть на некоторые распространенные мифы и идеи, которые распространяются о Maven, и увидеть, как они выдерживают научную экспертизу. В прошлый раз мы рассматривали идею, что Maven автоматически обновляется для каждой сборки . На этот раз мы рассмотрим другой миф, процитированный в этой статье: что Maven требуется подключение к Интернету для удаления каталога.
Миф № 2: Maven требует подключения к Интернету, чтобы удалить каталог
В этом выпуске я хочу взглянуть на другую цитату из той же записи в блоге, в которой говорится, что Maven требует доступ к Интернету для выполнения «очистки mvn» (и, как я предполагаю, для выполнения любой другой основной задачи):
«Maven не работает, если для удаления каталога требуется подключение к Интернету»
Давайте посмотрим на это немного ближе.
Когда вы устанавливаете Maven, вы устанавливаете только небольшое ядро - все основные функции Maven реализуются с помощью плагинов. Это намеренно (на самом деле это называется модульный дизайн). Итак, в первый раз вы используете определенный плагин жизненного цикла (что угодно, от «mvn clean» до «mvn deploy», и все что между ними). И это будет требовать доступа к сети — либо к центральному хранилищу, или (предпочтительно) на локальный менеджер хранилища. Это нормальное поведение, но оно может удивить новых пользователей и, безусловно, способствует репутации Maven как «загрузка интернета».
Итак, давайте воспроизведем это в лабораторных условиях. Я удалил свой локальный репозиторий (вы, конечно, никогда этого не сделаете в реальной среде) и запустил «mvn clean»:
$ rm -Rf ~/.m2/repository
$ mvn clean
[INFO] Scanning for projects...
[INFO] Reactor build order:
[INFO] Tweeter
[INFO] Tweeter domain model
[INFO] Tweeter service layer
[INFO] Tweeter web application
[INFO] ------------------------------------------------------------------------
[INFO] Building Tweeter
[INFO] task-segment: [clean]
[INFO] ------------------------------------------------------------------------
Downloading: <a target="_blank" href="http://localhost:8081/nexus/content/groups/public/org/apache/maven/" title="http://localhost:8081/nexus/content/groups/public/org/apache/maven/">http://localhost:8081/nexus/content/groups/public/org/apache/maven/</a>
plugins/maven-clean-plugin/2.2/maven-clean-plugin-2.2.pom
3K downloaded (maven-clean-plugin-2.2.pom)
Downloading: <a target="_blank" href="http://localhost:8081/nexus/content/groups/public/org/apache/maven/" title="http://localhost:8081/nexus/content/groups/public/org/apache/maven/">http://localhost:8081/nexus/content/groups/public/org/apache/maven/</a>
plugins/maven-plugins/10/maven-plugins-10.pom
7K downloaded (maven-plugins-10.pom)
Downloading: <a target="_blank" href="http://localhost:8081/nexus/content/groups/public/org/apache/" title="http://localhost:8081/nexus/content/groups/public/org/apache/">http://localhost:8081/nexus/content/groups/public/org/apache/</a>
maven/maven-parent/7/maven-parent-7.pom
20K downloaded (maven-parent-7.pom)
Downloading: <a target="_blank" href="http://localhost:8081/nexus/content/groups/public/org/apache/" title="http://localhost:8081/nexus/content/groups/public/org/apache/">http://localhost:8081/nexus/content/groups/public/org/apache/</a>
apache/4/apache-4.pom
4K downloaded (apache-4.pom)
Downloading: <a target="_blank" href="http://localhost:8081/nexus/content/groups/public/org/apache/maven/" title="http://localhost:8081/nexus/content/groups/public/org/apache/maven/">http://localhost:8081/nexus/content/groups/public/org/apache/maven/</a>
plugins/maven-clean-plugin/2.2/maven-clean-plugin-2.2.jar
11K downloaded (maven-clean-plugin-2.2.jar)
...
[INFO] [clean:clean {execution: default-clean}]
[INFO] Deleting directory /Users/johnsmart/Projects/wakaleo-training/tdd-training/
lab-solutions/tweeter/tweeter-web/target
[INFO]
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] ------------------------------------------------------------------------
[INFO] Tweeter ............................................... SUCCESS [8.806s]
[INFO] Tweeter domain model .................................. SUCCESS [0.044s]
[INFO] Tweeter service layer ................................. SUCCESS [0.054s]
[INFO] Tweeter web application ............................... SUCCESS [2.518s]
[INFO] ------------------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 12 seconds
[INFO] Finished at: Wed Jan 06 20:59:41 NZDT 2010
[INFO] Final Memory: 10M/80M
[INFO] ------------------------------------------------------------------------
Так что это действительно загружало материал из сети и действительно требовало доступа к сети. Но давайте проверим это немного дальше. Цитируемый миф подразумевает, однако, что Maven необходим доступ к сети каждый раз, когда он выполняет одну из этих основных функций. Итак, давайте посмотрим, что произойдет, когда мы снова запустим «mvn clean»:
$ mvn clean
[INFO] Scanning for projects...
[INFO] Reactor build order:
[INFO] Tweeter
[INFO] Tweeter domain model
[INFO] Tweeter service layer
[INFO] Tweeter web application
[INFO] ------------------------------------------------------------------------
[INFO] Building Tweeter
[INFO] task-segment: [clean]
[INFO] ------------------------------------------------------------------------
[INFO] [clean:clean {execution: default-clean}]
[INFO] ------------------------------------------------------------------------
[INFO] Building Tweeter domain model
[INFO] task-segment: [clean]
[INFO] ------------------------------------------------------------------------
[INFO] [clean:clean {execution: default-clean}]
[INFO] ------------------------------------------------------------------------
[INFO] Building Tweeter service layer
[INFO] task-segment: [clean]
[INFO] ------------------------------------------------------------------------
[INFO] [clean:clean {execution: default-clean}]
[INFO] ------------------------------------------------------------------------
[INFO] Building Tweeter web application
[INFO] task-segment: [clean]
[INFO] ------------------------------------------------------------------------
[INFO] [clean:clean {execution: default-clean}]
[INFO]
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] ------------------------------------------------------------------------
[INFO] Tweeter ............................................... SUCCESS [0.780s]
[INFO] Tweeter domain model .................................. SUCCESS [0.007s]
[INFO] Tweeter service layer ................................. SUCCESS [0.016s]
[INFO] Tweeter web application ............................... SUCCESS [0.408s]
[INFO] ------------------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2 seconds
[INFO] Finished at: Wed Jan 06 21:16:09 NZDT 2010
[INFO] Final Memory: 9M/80M
[INFO] ------------------------------------------------------------------------
На этот раз Maven не требовал доступа к сети и не скачивал файлы. Фактически, Maven никогда не потребует от вас загрузки чего-либо, связанного с этими основными плагинами, более одного раза. Основные подключаемые модули Maven привязаны к версии Maven, которую вы используете — после того, как вы загрузили их для одного проекта, они будут доступны для всех других сборок Maven на вашем компьютере.
Теперь у блогера есть смысл — возможно, Maven должен загрузить основные плагины жизненного цикла и установить их в локальный репозиторий во время процесса установки. Но Maven использует разные плагины для разных типов проектов (JAR, WAR, EAR …), так что это приведет к довольно большой загрузке, не все из которых обязательно потребуются для ваших конкретных проектов. Но если это то, что нужно, чтобы пользователи были довольны, почему бы и нет?
Однако идея о том, что Maven систематически нуждается в доступе к сети для основных функций, таких как «mvn clean», явно несостоятельна.
(Название и некоторые изображения этого блога, конечно, были бесстыдно украдены из великого и очень научного сериала MythBusters .)