Как пропустить этап установки в сборке Maven, если у меня уже установлена ​​эта версия в режиме репо

У меня есть проект, состоящий из 3 разных библиотек. Когда я запускаю install script, он берет все библиотеки из репо и запускает mvn clean install на них. Но эта версия библиотеки уже установлена ​​в репо. Есть ли способ пропустить фазу установки, если версия в pom.xml равна версии в моем локальном репо.

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

Ответ 1

Вы можете обойти как это

-Dmaven.install.skip=true

<profiles>
   <profile>
     <id>skipInstall</id>
     <activation>
       <property>
         <name>maven.install.skip</name>
         <value>true</value>
       </property>
     </activation>
     <build>
       <pluginManagement>
         <plugins>
           <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-install-plugin</artifactId>
             <executions>
               <execution>
                 <id>default-install</id>
                 <phase>none</phase>
               </execution>
             </executions>
           </plugin>
         </plugins>
       </pluginManagement>
     </build>
   </profile>

На прошлой неделе Оливье Лами залатал эту хиру.

MINSTALL-73

Ответ 2

Большинство плагинов maven можно пропустить, указав что-то вроде:

        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>X.Y</version>
          <configuration>
            <skip>true</skip>
          </configuration>
        </plugin>

вы также можете настроить профили сборки для установки свойств и использовать их для определения значения. например, запустив команду: mvn -Pexample выберет "примерный" профиль. Затем POM будет содержать:

...
  <properties>
    <skip.install>false</skip.install>
...
  </properties>

...
    <profile>
      <id>example</id>
      <properties>
        <skip.install>false</skip.install>
      </properties>
    </profile>
...
    <plugin>
      <artifactId>maven-install-plugin</artifactId>
      <version>X.Y</version>
      <configuration>
        <skip>${skip.install}</skip>
      </configuration>
    </plugin>
...

Используя эти дополнения POM, поведение по умолчанию для плагина установки будет состоять из цели по умолчанию, но если выбран профиль профиля, то плагин установки пропустит его цель.

Ответ 3

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

В моем супер-помпе я добавил pluginManagement/plugin, чтобы отключить фазы установки по умолчанию и по умолчанию, когда установлено свойство deployOnly.

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-install-plugin</artifactId>
                <version>2.5.2</version>
                <executions>
                    <execution>
                        <id>default-install</id>
                        <configuration>
                            <skip>${deployOnly}</skip>
                        </configuration>
                    </execution>
                    <execution>
                        <id>default-test</id>
                        <configuration>
                            <skip>${deployOnly}</skip>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

Итак, в командной строке я могу отключить фазы установки и тестирования, добавив -DdeployOnly.

mvn clean install       #build and test everything
mvn deploy -DdeployOnly #just deploy it

Ответ 4

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

Вы уверены, что правильно поняли, что означал ваш босс? Я интерпретирую это как "не устанавливайте сторонние библиотеки в вашем локальном репозитории, используйте только библиотеки, доступные в публичных репозиториях". Это отличается от "не использовать ваш локальный репозиторий", что в принципе невозможно, это просто не то, как работает maven. Я попытаюсь прояснить этот момент.

Кроме того, я не задаю вопрос, который очень смущает (о каком репо вы говорите? Что делает установка script? Почему вы называете чистую установку в библиотеках? и т.д.).

Ответ 5

Расширяя другие ответы, из будущего.

Плагины Maven обладают удивительно высокой свободой, как они работают. Если они хотят, они могут игнорировать/переопределять типичные настройки pom.xml. Кроме того, <configuration><skip>true</skip></configuration> является всего лишь соглашением, и ничто не обязывает плагин следовать ему, за исключением того, что большинство из них разработано так.

Мои эксперименты с недавней проблемой показывают, что должны быть использованы как решения @Cemo, так и @MiloshBoroyevich, и плагин требует, чтобы оба действительно позволили нам покоиться с миром. Более конкретно, единственная рабочая конфигурация, которую я сделал, была такой:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-install-plugin</artifactId>
    <version>2.5.2</version>
    <executions>
        <execution>
            <id>default-install</id>
            <phase>none</phase>
        </execution>
    </executions>
    <configuration>
        <skip>true</skip>
    </configuration>
</plugin>