Почему Maven (неправильно?) Развертывает мой SNAPSHOT в репозиториях релиза и снимка? - PullRequest
6 голосов
/ 04 ноября 2010

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

Основная проблема заключается в том, что когда я выполняю "mvn deploy"«Артефакт успешно развернут в репозитории моментальных снимков, но Maven также пытается развернуть его в репозитории релизов, который завершается ошибкой ... как следует.Насколько я понимаю, моя текущая конфигурация состоит в том, что она НЕ должна развертывать ее и в репозитории релизов.

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

Любая помощь / разъяснения по этому вопросу будут очень полезны.

У меня есть следующее в моем POMдля управления распространением:

<distributionManagement>
<repository>
  <id>internal-releases</id>
  <name>Internal Releases</name>
  <url>http://localhost:8081/nexus/content/repositories/releases</url>
</repository>
<snapshotRepository>
  <id>internal-snapshots</id>
  <name>Internal Snapshots</name>
  <url>http://localhost:8081/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>

В другом месте в POM у меня есть следующие настройки, позволяющие использовать эти хранилища для получения артефактов:

<repositories>
<repository>
  <id>internal-releases</id>
  <url>http://localhost:8081/nexus/content/repositories/releases</url>
  <snapshots><enabled>false</enabled></snapshots>
</repository>
<repository>
  <id>internal-snapshots</id>
  <url>http://localhost:8081/nexus/content/repositories/snapshots</url>
  <snapshots><enabled>true</enabled></snapshots>
</repository>
<!-- other repos, etc, etc -->
</repositories>

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

Проблема заключается в том, что он также пытается развернуть моментальный снимок в выпуске.репозиторий, который настроен на запрет снимков.

The output из "mvn deploy" включает в себя следующее:

[INFO] [deploy:deploy {execution: default-deploy}]
[INFO] Retrieving previous build number from internal-snapshots
Uploading: http://localhost:8081/nexus/content/repositories/snapshots/com/internal/service/1.0.0-SNAPSHOT/service-1.0.0-20101104.170338-8.war
405K uploaded  (service-1.0.0-20101104.170338-8.war)
[INFO] Retrieving previous metadata from internal-snapshots
[INFO] Uploading repository metadata for: 'snapshot com.internal:service:1.0.0-SNAPSHOT'
[INFO] Retrieving previous metadata from internal-snapshots
[INFO] Uploading repository metadata for: 'artifact com.internal:service'
[INFO] Uploading project information for service 1.0.0-20101104.170338-8
[INFO] [deploy:deploy-file {execution: default}]
[INFO] Retrieving previous build number from remote-repository
[INFO] repository metadata for: 'snapshot com.internal:service:1.0.0-SNAPSHOT' could not be found on repository: remote-repository, so will be created
Uploading: http://localhost:8081/nexus/content/repositories/releases/com/internal/service/1.0.0-SNAPSHOT/service-1.0.0-20101104.170338-1.jar
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Error deploying artifact: Failed to transfer file: http://localhost:8081/nexus/content/repositories/releases/com/internal/service/1.0.0-SNAPSHOT/service-1.0.0-20101104.170338-1.jar. Return code is: 400

Журнал от Nexus содержит следующее (как я и ожидал):

jvm 1    | 2010-11-04 13:03:39 INFO  [p-759477796-118] - o.s.n.p.m.m.M2Repos~          - Storing of item releases:/com/internal/service/1.0.0-SNAPSHOT/service-1.0.0-20101104.170338-1.jar is forbidden by Maven Repository policy. Because releases is a RELEASE repository
jvm 1    | 2010-11-04 13:03:39 ERROR [p-759477796-118] - o.s.n.r.ContentPlex~          - Got exception during processing request "PUT http://localhost:8081/nexus/content/repositories/releases/com/internal/service/1.0.0-SNAPSHOT/service-1.0.0-20101104.170338-1.jar": Storing of item releases:/com/internal/service/1.0.0-SNAPSHOT/service-1.0.0-20101104.170338-1.jar is forbidden by Maven Repository policy. Because releases is a RELEASE repository

Ответы [ 3 ]

9 голосов
/ 13 сентября 2012
  1. Определите следующее свойство в вашем помпе

    <deployFileUrl>${project.distributionManagement.snapshotRepository.url}</deployFileUrl>
    
  2. Измените конфигурацию maven-deploy-plugin следующим образом:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-deploy-plugin</artifactId>
        <version>2.5</version>
        <configuration>
            <skip>true</skip>
        </configuration>
        <executions>
            <execution>
                <phase>deploy</phase>
                <configuration>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                    <url>${deployFileUrl}</url>
                    <artifactId>${project.artifactId}</artifactId>
                    <groupId>${project.groupId}</groupId>
                    <version>${project.version}</version>
                    <file>${project.build.directory}/${project.build.finalName}.jar</file>
                </configuration>
                <goals>
                    <goal>deploy-file</goal>
                </goals>
            </execution>
         </executions>
     </plugin>
    
  3. Добавьте следующий профиль, чтобы установить свойство deployFileUrl с URL-адресом хранилища

    <profiles>
        <profile>
            <id>release-mode</id>
            <properties>
                <deployFileUrl>${project.distributionManagement.repository.url}</deployFileUrl>
            </properties>
        </profile>
    </profiles>
    
  4. Наконец, вызовите этот профиль в maven-release-plugin

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-release-plugin</artifactId>
        <version>2.0-beta-9</version>
        <configuration>
            <releaseProfiles>release-mode</releaseProfiles>
        </configuration>
     </plugin>
    
5 голосов
/ 06 ноября 2010

Так что лучшая подсказка на самом деле оказалась прямо перед моими глазами в журнале. Единственный артефакт, который, как я думал, был создан POM, с которым я работал, был .war, но в журнале вы заметите, что артефакт, который Maven пытается развернуть в релизе, на самом деле .jar.

Этого было достаточно в качестве указателя (который указан в списке рассылки пользователей Maven, указанном), чтобы найти и в итоге обнаружить, что кто-то включил следующую дополнительную конфигурацию для фазы развертывания.

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<executions>
<execution>
  <phase>deploy</phase>
    <goals>
      <goal>deploy-file</goal>
    </goals>
    <configuration>
      <packaging>jar</packaging>
      <generatePom>true</generatePom>
      <url>${project.distributionManagement.repository.url}</url>
      <artifactId>${project.artifactId}</artifactId>
      <groupId>${project.groupId}</groupId>
      <version>${project.version}</version>
      <file>${project.build.directory}/${project.build.finalName}.jar</file>
    </configuration>
  </execution>
</executions>
</plugin>

Обратите внимание, что на самом деле это прямая ссылка ${project.distributionManagement.repository.url}. Кроме того, эта конфигурация была несколько ошибочной и должна была быть выполнена с помощью свойства attachClasses плагина war.

1 голос
/ 05 ноября 2010

Может ли быть так, что у артефакта версии нет суффикса -SNAPSHOT?

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