Ok, я думаю, что следующий может делать то, что вам нужно. Недостатком этого подхода является то, что между каждым развертыванием будет промежуток, так как выполняется последующая сборка. Это приемлемо?
Определить профиль в каждом проекте с тем же именем (скажем, «публиковать»). Внутри этого профиля вы можете определить конфигурацию для использования antrun-plugin для доставки файлов с FTP (см. Ниже).
В родительском проекте у вас будет элемент модулей, определяющий каждый проект как модуль. Если вы запустите mvn install -P publish
, каждый проект будет построен в свою очередь с включенным профилем публикации, а конечный артефакт будет опубликован для цели на этапе установки. Если вам нужно развернуть дополнительные файлы, измените соответственно element
.
Обратите внимание, что параметры для задачи FTP заданы как свойства, что позволяет их переопределить из командной строки и/или унаследовать от родительского POM.
<profiles>
<profile>
<id>publish</id>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>ftp</id>
<phase>install</phase>
<configuration>
<tasks>
<ftp action="send"
server="${ftp.host}" remotedir="${ftp.remotedir}"
userid="${ftp.userid}" password="${ftp.password}"
depends="${ftp.depends}" verbose="${ftp.verbose}">
<fileset dir="${project.build.directory}">
<include
name="${project.build.finalName}.${project.packaging}"/>
</fileset>
</ftp>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>1.4.1</version>
</dependency>
<dependency>
<groupId>ant</groupId>
<artifactId>ant-commons-net</artifactId>
<version>1.6.5</version>
</dependency>
<dependency>
<groupId>ant</groupId>
<artifactId>ant-nodeps</artifactId>
<version>1.6.5</version>
</dependency>
</dependencies>
</plugin>
<properties>
<ftp.host>hostname</ftp.host>
<ftp.remotedir>/opt/path/to/install</ftp.remotedir>
<ftp.userid>user</ftp.userid>
<ftp.password>mypassword</ftp.password>
<ftp.depends>yes</ftp.depends>
<ftp.verbose>no</ftp.verbose>
</properties>
</profile>
</profiles>
Обновления: на основе вашего комментария: Вы можете использовать плагин зависимостей для загрузки каждой зависимости, за исключением того, что родитель не может иметь зависимость от ребенка, и он будет построен перед ребенком , Это должен был быть еще один проект. вам также необходимо иметь информацию о том, где их развернуть. На данный момент у вас есть целевая информация в отдельных проектах, поэтому она недоступна в проекте развертывания.
Используя этот подход, вы можете определить несколько профилей в новом проекте, по одному для каждого артефакта. Каждый профиль определяет зависимость: выполнение копирования, чтобы получить банку и выполнение antrun для одного из проектов. Обычную конфигурацию (такую как зависимости для плагина antrun) можно вытащить из профилей. Также имейте в виду, что свойства будут объединены, если вы определите несколько профилей, поэтому вам может потребоваться квалифицировать их с именем артефакта, например ftp.artifact1.host
.
<profiles>
<profile>
<id>deploy-artifact1</id>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependency</id>
<phase>prepare-package</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>name.seller.rich</groupId>
<artifactId>artifact1</artifactId>
<version>1.0.0</version>
<type>jar</type>
<overWrite>false</overWrite>
</artifactItem>
</artifactItems>
<outputDirectory>${project.build.directory}/deploy-staging</outputDirectory>
<overWriteReleases>false</overWriteReleases>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>ftp</id>
<phase>install</phase>
<configuration>
<tasks>
<ftp action="send"
server="${ftp.host}" remotedir="${ftp.remotedir}"
userid="${ftp.userid}" password="${ftp.password}"
depends="${ftp.depends}" verbose="${ftp.verbose}">
<fileset dir="${project.build.directory} includes="deploy-staging/"/>
</ftp>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
<properties>
<!--if the properties differ between targets, qualify them with the artifact name-->
<ftp.host>hostname</ftp.host>
<ftp.remotedir>/opt/path/to/install</ftp.remotedir>
<ftp.userid>user</ftp.userid>
<ftp.password>mypassword</ftp.password>
<ftp.depends>yes</ftp.depends>
<ftp.verbose>no</ftp.verbose>
</properties>
</profile>
</profiles>
Ха-ха. Мне жаль, что я не «застрял» с Maven в моей компании. – SingleShot
Я не имел в виду это унизительным способом :) – Bostone
Я не понимаю, что означает «Назначение на уровне подпроекта». Вы доставляете все файлы в каждый пункт назначения? –