2009-09-10 2 views
19

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

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

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

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

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

+1

Ха-ха. Мне жаль, что я не «застрял» с Maven в моей компании. – SingleShot

+0

Я не имел в виду это унизительным способом :) – Bostone

+0

Я не понимаю, что означает «Назначение на уровне подпроекта». Вы доставляете все файлы в каждый пункт назначения? –

ответ

12

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> 
+0

Это должно сработать. Профиль - это то, что я пропустил вместе. Вот еще одна идея, которая должна помочь с «икотой» - вместо определения подпроектов в качестве модулей определять их как зависимости в родительском POM и извлекать JAR-файлы артефактов в их адресаты с использованием плагина зависимостей. Будет ли это работать? – Bostone

+0

Я забыл упомянуть, что на нашем предприятии мы используем NAC, чтобы иметь возможность отображать/получать доступ к любому серверу, как к сопоставленной директории (как Win/* NIX), так что в действительности нет необходимости в FTP или SSH – Bostone

+0

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

0

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

Как я понимаю - сборка плагинов создаст какой-то архив (jar, war, zip) - это не работает для меня - мне нужны фактические файлы/папки для копирования в пункт назначения. На самом деле - плагин maven-dependency, похоже, лучше подходит, так как он может «распаковать», но затем я застрял, так как не могу определить подпроекты как модули и зависимости. Таким образом, маршрут, который я собираюсь на самом деле после предложений Rich, - определить профиль и скопировать файлы во время фазы установки. – Bostone

+0

dir создал бы каталог – sal

0

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

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

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

+0

Я закончил тем, что использовал профили и antrun - лучшее из обоих миров! – Bostone

+0

отлично! Я думаю, что Antrun - это способ обойти тех, кто le Maven require;) –

1

Не работает без кодовой фразы.

<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> 

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

+0

Чтобы заставить 'rsync' работать таким образом, мне пришлось добавить' 1.8 'after' maven-antrun-plugin'. Без этого она фактически не выполняла команду, даже если она печатала '[INFO] Выполненные задачи'. – Tom

5

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

  1. Используйте команду МВН установить -Dftp.password = пароль

Поскольку я хочу передать пароль из командной строки для соображений безопасности, я использовал -Dftp.password = пароль После выполнение вышеуказанной команды все файлы jar из целевой папки проекта maven будут развернуты в папке MAVEN на сервере.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> 
Смежные вопросы