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

Использование Maven для развертывания

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Используя этот подход, вы можете определить несколько профилей в новом проекте, по одному для каждого артефакта. Каждый профиль определяет зависимость: выполнение копирования, чтобы получить банку и выполнение 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>  

Ответ 2

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

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

Так как я хочу передать пароль из командной строки по соображениям безопасности, я использовал -Dftp.password = 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="[email protected]:/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>

Ответ 3

Не работает без парольной фразы.

    <profile>
        <id>publish</id>
        <build>
            <plugins>
                <plugin>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>scp</id>
                            <phase>deploy</phase>
                            <configuration>
                                <tasks>
                                    <scp todir="[email protected]: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="[email protected]:some/remote/dir/." />
                                    </exec>
                                </target>
                            </configuration>
                            <goals>
                                <goal>run</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>

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

Ответ 4

Я бы посмотрел на использование 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>

Ответ 5

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

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

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