Использование Maven для развертывания - PullRequest
20 голосов
/ 10 сентября 2009

У меня есть эта задача для проекта с 4 вложенными подпроектами, использующими Maven:

  1. Для каждого дочернего: каталог ресурсов, включая зависимости проекта
  2. Перейти к родительскому проекту
  3. С помощью одной команды извлеките все созданные архивы в различные удаленные места назначения (полная установка), которые могут включать в себя http-сервер, сервер приложений, файловый сервер и т. Д. (В основном * NIX). Направление предоставляется на уровне подпроекта
  4. Также должна быть возможность распаковать / скопировать из отдельного подпроекта (частичная установка)

Файлы не являются Java - в основном это различные скрипты и HTML

Я смотрю на различные плагины, чтобы помочь с задачей: сборка, зависимость, antrun, unzip. Зависимость выглядит многообещающе, но мне нужно распаковать не только фляги зависимостей, но и содержимое (под) проекта. Кроме того, поскольку я не могу действительно привязать операцию к жизненному циклу Maven, как я могу инициировать удаленную установку? mvn зависимость: распаковать? Это не очень наглядно или интуитивно понятно. Можно ли создать собственную цель (например, проект: установить) без написания плагина?

Использование Maven является стандартом компании, поэтому, пожалуйста, не предлагайте альтернативы - я в значительной степени застрял с тем, что у меня есть

Ответы [ 5 ]

13 голосов
/ 10 сентября 2009

Хорошо, я думаю, что следующее может сделать то, что вам нужно. Недостаток этого подхода заключается в том, что между каждым развертыванием будет выполняться интервал при выполнении последующей сборки. Это приемлемо?

Определите профиль в каждом проекте с тем же именем (скажем, «опубликовать»). В этом профиле вы можете определить конфигурацию для использования плагина antrun для доставки файлов по FTP (см. Ниже).

В родительском проекте у вас будет элемент modules, определяющий каждый проект как модуль. Если вы запустите mvn install -P publish, каждый проект будет построен по очереди с включенным профилем публикации, а последний артефакт будет опубликован для цели на этапе установки. Если вам нужно развернуть дополнительные файлы, измените include 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>

Обновление: на основе вашего комментария: вы можете использовать плагин зависимостей для загрузки каждой зависимости, за исключением того, что родитель не может иметь зависимость от дочернего элемента, и он будет построен раньше дочернего элемента. Это должен быть другой проект. Вы также должны иметь где-то информацию о том, где их разместить. На данный момент у вас есть целевая информация в отдельных проектах, поэтому она не доступна в проекте развертывания.

При таком подходе вы можете определить несколько профилей в новом проекте, по одному для каждого артефакта. Каждый профиль определяет зависимость: выполнение копии для получения jar и выполнение 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>  
5 голосов
/ 26 июня 2015

Ниже POM поможет скопировать файл jar из директории сборки проекта на удаленный SFTP / FTP-сервер.

  1. Использовать команду mvn install -Dftp.password = пароль

Поскольку я хочу передать пароль из командной строки по соображениям безопасности, я использовал -Dftp.password = пароль После выполнения вышеуказанной команды все файлы jar из целевой папки проекта maven будут развернуты в папке MAVEN на server.com

    <plugin>          <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>

    <executions>
        <execution>
            <id>ftp</id>
            <phase>install</phase>
            <configuration>
                <tasks>
                    <scp todir="user@server.com:/MAVEN/"
                        sftp="true" port="22" trust="true" password="${ftp.password}"
                        failonerror="false" verbose="true" passphrase="">
                        <fileset dir="${project.build.directory}">
                            <include name="*.jar" />
                        </fileset>
                    </scp>
                </tasks>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>org.apache.ant</groupId>
            <artifactId>ant-jsch</artifactId>
            <version>1.9.4</version>
        </dependency>
    </dependencies>

</plugin>
1 голос
/ 01 июля 2014

Не работает без ключевой фразы.

    <profile>
        <id>publish</id>
        <build>
            <plugins>
                <plugin>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>scp</id>
                            <phase>deploy</phase>
                            <configuration>
                                <tasks>
                                    <scp todir="user@host:some/remote/dir"
                                         sftp="true"
                                         keyfile="${user.home}/.ssh/devel-deploy.id_dsa"
                                         failonerror="false"
                                         verbose="true"
                                         passphrase="nopass"
                                    >
                                        <fileset dir="${project.build.directory}">
                                            <include
                                                name="${project.build.finalName}.${project.packaging}"/>
                                        </fileset>
                                    </scp>
                                </tasks>
                            </configuration>
                            <goals>
                                <goal>run</goal>
                            </goals>
                        </execution>
                    </executions>
                    <dependencies>
                        <dependency>
                            <groupId>org.apache.ant</groupId>
                            <artifactId>ant-jsch</artifactId>
                            <version>1.9.4</version>
                        </dependency>
                    </dependencies>
                </plugin>
            </plugins>
        </build>
    </profile>

Тем не менее, мой любимый

    <profile>
        <id>upload-devel</id>
        <build>
            <plugins>
                <plugin>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>upload-devel</id>
                            <phase>deploy</phase>
                            <configuration>
                                <target>
                                    <exec executable="rsync" failonerror="false">
                                        <arg value="-aiz" />
                                        <arg value="${project.build.directory}/${project.artifactId}.${project.packaging}" />
                                        <arg value="user@host:some/remote/dir/." />
                                    </exec>
                                </target>
                            </configuration>
                            <goals>
                                <goal>run</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>

хотя я не знаю, насколько это совместимо с разными платформами.

0 голосов
/ 11 сентября 2009

Maven не предназначен для развертывания JAR-файлов в удаленном месте; его основное использование - сборка и упаковка артефактов. Цели сборки и зависимости используются главным образом для сбора зависимостей и файлов для упаковки в артефакт.

Сказав это, у maven есть цель развертывания, в которой используется компонент, называемый wagon. Это в первую очередь предназначено для развертывания в хранилище maven. Существует плагин под названием Cargo, который можно использовать для развертывания артефактов на удаленном сервере, но он не разбивает содержимое jar-файла (для этого все зависит от целевого сервера приложений). Возможно, вы сможете расширить функциональность Maven Wagon самостоятельно.

Также возможно упаковать пользовательский жизненный цикл, но это входит в довольно низкоуровневый maven mojo (каламбур).

0 голосов
/ 11 сентября 2009

Я бы посмотрел на использование maven-assembly-plugin для этого.

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

<assembly>
  <id>xyzzy</id>
  <formats>
   <format>zip</format>
  </formats>
  <fileSets>
   <fileSet>
      <directory>../subproject1/target/</directory>
      <outputDirectory>/foo</outputDirectory>
      <includes>
        <include>*.jar</include>
      </includes>
   </fileSet>
   <fileSet>
      <directory>../subproject1/target/html-output/</directory>
      <outputDirectory>/foo</outputDirectory>
      <includes>
        <include>*.html</include>
        <include>*.js</include>
        <include>*.css</include>
      </includes>
    </fileSet>     
    <fileSet>
      <directory>../subproject2/target/</directory>
      <outputDirectory>/bar</outputDirectory>
      <includes>
        <include>**/**</include>
      </includes>
      <excludes>
        <exclude>**/*.exclude-this</exclude>
      </excludes>
    </fileSet>
  </fileSets> 
</assembly>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...