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>
Ответы
Ответ 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>
, если это необходимо.