Подтвердить что ты не робот

Maven - Зависит от собранного почтового индекса

Я пытаюсь создать Project B, вытащить (и распаковать) ZIP, созданный Project A, и развернут в удаленном репозитории.

ZIP создается и прикрепляется с помощью maven-assembly-plugin, с типом упаковки pom:

<artifactId>project-a</artifactId>
<name>ZIP</name>
<description>Used by Project B</description>
<packaging>pom</packaging>

...

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
  <executions>
    <execution>
      <id>distribution-package</id>
      <phase>package</phase>
      <goals>
        <goal>single</goal>
      </goals>
      <configuration>
        <descriptors>
          <descriptor>src/main/assembly/scripts.xml</descriptor>
        </descriptors>
        <tarLongFileMode>gnu</tarLongFileMode>
      </configuration>
    </execution>
  </executions>
</plugin>

Попытка вывести его из проекта B pom с помощью maven-dependency-plugin:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <executions>
    <execution>
      <id>copy-scripts</id>
      <phase>package</phase>
      <goals>
        <goal>copy</goal>
      </goals>
      <configuration>
        <outputDirectory>${basedir}/target/staging</outputDirectory>
        <stripVersion>true</stripVersion>
        <artifactItems>
          <artifactItem>
            <groupId>...</groupId>
            <artifactId>...</artifactId>
            <version>...</version>
            <overWrite>true</overWrite>
            <type>zip</type>
          </artifactItem>
        </artifactItems>
      </configuration>
    </execution>
  </executions>
</plugin>

не удается: [ERROR] Failed to execute goal on project ...: Could not resolve dependencies for project group:artifact:pom:version: Could not find artifact group:project-a:zip:version in nexus (http://...:8081/nexus/content/groups/public) -> [Help 1]

Я бы предположил, что это потому, что я указал Проект A как pom, а не zip, однако я не могу указать Проект A как тип упаковки zip, потому что это приводит к:

[ERROR]     Unknown packaging: zip @ line 13, column 13

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

Я также проверил, чтобы собранный почтовый индекс действительно находился в связке.

ОБНОВЛЕНО ОТ ОТВЕТОВ

Для кого-то еще, то, что мне не хватало, заключается в том, что <classifier> зависимости должен соответствовать <id> сборки. Обратите внимание, где thisistheattachedartifactsclassifier указан в следующих файлах.

scripts.xml(Project A):

<assembly>
  <id>thisistheattachedartifactsclassifier</id>
  <formats>
    <format>zip</format>
  </formats>

  <fileSets>
    <fileSet>
      <directory>src/main/resources</directory>
      ...
    </fileSet>
  </fileSets>
</assembly>

pom.xml(Project B):

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <executions>
    <execution>
      <id>copy-scripts</id>
      <phase>package</phase>
      <goals>
        <goal>copy</goal>
      </goals>
      <configuration>
        <outputDirectory>${basedir}/target/staging</outputDirectory>
        <stripVersion>true</stripVersion>
        <artifactItems>
          <artifactItem>
            <groupId>...</groupId>
            <artifactId>...</artifactId>
            <version>...</version>
            <classifier>thisistheattachedartifactsclassifier</classifier>
            <overWrite>true</overWrite>
            <type>zip</type>
          </artifactItem>
        </artifactItems>
      </configuration>
    </execution>
  </executions>
</plugin>
4b9b3361

Ответ 1

Добро пожаловать в переполнение стека:).

Вы на правильном пути. Ваша настоящая проблема - использовать zip.

Следующая конфигурация в порядке и отлично работает для меня. Это старый (2 года назад), и я не уверен, что это соответствует лучшим практикам. Но я знаю, что работаю.

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

Проект Zip:

pom.xml

<groupId>com.mycompany</groupId>
<artifactId>cfg_dev</artifactId>
<version>1.1.0</version>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <executions>
                <execution>
                    <id>cfg-main-resources</id>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <phase>package</phase>
                    <configuration>
                        <descriptors>
                            <descriptor>/src/main/assembly/resources.xml</descriptor>
                        </descriptors>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Дескриптор сборки: Он создаст этот артефакт: cfg_dev-1.1.0-resources.zip Обратите внимание, что

  • это zip-архив
  • "классификатор" - это ресурсы (например, имя сборки)

    Ресурсы   застежка-молния ложный        SRC/основные/ресурсы        

Основной проект:

pom.xml

Обратите внимание, что

  • это зависит от архива zip
  • "классификатор" зависимостей - это ресурсы (например, предыдущее имя сборки)

    <!-- Unit test dependency -->
    <dependency>
        <groupId>com.mycompany</groupId>
        <artifactId>cfg_dev</artifactId>
        <version>${project.version}</version>
        <classifier>resources</classifier>
        <type>zip</type>
        <scope>test</scope>
    </dependency>
    
    ...
    

                               SRC/тест/ресурсы           правда                                $ {project.build.directory}/тест-ресурсы           правда          

    <plugins>
    
    
        <!-- Unzip shared resources -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>unpack-cfg-test-resources</id>
                    <goals>
                        <goal>unpack-dependencies</goal>
                    </goals>
                    <phase>generate-test-resources</phase>
                    <configuration>
                        <outputDirectory>${project.build.directory}/test-resources</outputDirectory>
                        <includeArtifactIds>cfg_dev</includeArtifactIds>
                        <includeGroupIds>${project.groupId}</includeGroupIds>
                        <excludeTransitive>true</excludeTransitive>
                        <excludeTypes>pom</excludeTypes>
                        <scope>test</scope>
                    </configuration>
                </execution>
            </executions>
        </plugin>
      </plugins>
    

Надеюсь, это понятно, и это поможет вам:)

Ответ 2

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

Если у вас нет конкретных требований к упаковке (включая, исключая и т.д.), это не потребует дополнительной настройки: просто поместите свои данные в свой проект src/main/resources.

Этот подход имеет дополнительное преимущество при работе без изменений при вызове из среды IDE, такой как Eclipse.

Ответ 3

Если вы когда-нибудь захотите сделать что-то подобное из командной строки (например, из script без необходимости писать файл pom.xml), вот как это сделать...

Вы можете указать отдельные свойства:

mvn dependency:copy -DgroupId=org.apache.maven -DartifactId=maven-core -Dversion=2.2.1 -Dpackaging=zip -Dclassifier=thisistheattachedartifactsclassifier

Или укажите их все в одном параметре artifact:

mvn dependency:copy -Dartifact=org.apache.maven:maven-core:2.2.1:zip:thisistheattachedartifactsclassifier

В последнем случае важно сохранить classifier в конце, после атрибута packaging/type. Например: -Dartifact=groupId:artifactId:version:type:classifier

Вы также можете указать целевой каталог, используя параметр -DoutputDirectory=<directory>, если это необходимо.