Лучшие практики для копирования файлов с Maven - PullRequest
176 голосов
/ 25 февраля 2009

У меня есть файлы конфигурации и различные документы, которые я хочу скопировать из среды dev в каталог dev-server с помощью Maven2. Как ни странно, Maven не кажется сильным в этой задаче.


Некоторые из вариантов:

  • Простое использование задачи copy в Maven

<copy file="src/main/resources/config.properties" tofile="${project.server.config}/config.properties"/>

  • Используйте плагин Ant для запуска копирования из Ant.

  • Создайте артефакт типа zip рядом с «основным» артефактом POM, который обычно имеет тип jar , затем unpack , который артефакт из хранилища в целевой каталог.

  • плагин maven-resources , как указано ниже.

  • Плагин Maven Assembly - но для этого требуется много ручных определений, когда я хочу сделать что-то просто и "условно".

  • На этой странице даже показано, как создать плагин для копирования!

  • плагин maven-upload , как указано ниже.

  • плагин maven-dependency-plugin с copy , как указано ниже.


Все это кажется излишне специальным: Maven должен превосходно выполнять эти стандартные задачи без суеты и беспокойства.

Любой совет?

Ответы [ 13 ]

132 голосов
/ 10 августа 2009
<build>
    <plugins>
        ...
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.3</version>
        </plugin>
    </plugins>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include> **/*.properties</include>
            </includes>
        </resource>
    </resources>
    ...
</build>
110 голосов
/ 29 марта 2009

Не уклоняйтесь от плагина Antrun. Просто потому, что некоторые люди склонны думать, что Муравей и Мавен находятся в оппозиции, это не так. Используйте задачу копирования, если вам нужно выполнить одноразовую настройку, которая неизбежна:

<project>
  [...]
  <build>
    <plugins>
      [...]
      <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <executions>
          <execution>
            <phase>deploy</phase>
            <configuration>
              <tasks>

                <!--
                  Place any Ant task here. You can add anything
                  you can add between <target> and </target> in a
                  build.xml.
                -->

              </tasks>
            </configuration>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

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

Опять же, я уверен, что есть лучший способ.

30 голосов
/ 18 августа 2015

Для копирования файла используйте:

        <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.7</version>
            <executions>
                <execution>
                    <id>copy-resource-one</id>
                    <phase>install</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>

                    <configuration>
                        <outputDirectory>${basedir}/destination-folder</outputDirectory>
                        <resources>
                            <resource>
                                <directory>/source-folder</directory>
                                <includes>
                                    <include>file.jar</include>
                                </includes>
                            </resource>
                        </resources>
                    </configuration>
                </execution>
           </executions>
        </plugin>

Для копирования папки с подпапками используйте следующую конфигурацию:

           <configuration>
              <outputDirectory>${basedir}/target-folder</outputDirectory>
              <resources>          
                <resource>
                  <directory>/source-folder</directory>
                  <filtering>true</filtering>
                </resource>
              </resources>              
            </configuration>  
18 голосов
/ 18 ноября 2011

Плагин Maven для зависимостей сэкономил мне много времени, занимаясь муравьиными заданиями:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>install-jar</id>
            <phase>install</phase>
            <goals>
                <goal>copy</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>...</groupId>
                        <artifactId>...</artifactId>
                        <version>...</version>
                    </artifactItem>
                </artifactItems>
                <outputDirectory>...</outputDirectory>
                <stripVersion>true</stripVersion>
            </configuration>
        </execution>
    </executions>
</plugin>

Зависимость : копия документирована и имеет более полезные цели, такие как распаковка.

15 голосов
/ 19 апреля 2016

Для простых задач копирования я могу порекомендовать copy-rename-maven-plugin . Это просто и удобно в использовании:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>com.coderplus.maven.plugins</groupId>
        <artifactId>copy-rename-maven-plugin</artifactId>
        <version>1.0</version>
        <executions>
          <execution>
            <id>copy-file</id>
            <phase>generate-sources</phase>
            <goals>
              <goal>copy</goal>
            </goals>
            <configuration>
              <sourceFile>src/someDirectory/test.environment.properties</sourceFile>
              <destinationFile>target/someDir/environment.properties</destinationFile>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

Если вы хотите скопировать более одного файла, замените деталь <sourceFile>...</destinationFile> на

<fileSets>
  <fileSet>
    <sourceFile>src/someDirectory/test.environment.properties</sourceFile>
    <destinationFile>target/someDir/environment.properties</destinationFile>
  </fileSet>
  <fileSet>
    <sourceFile>src/someDirectory/test.logback.xml</sourceFile>
    <destinationFile>target/someDir/logback.xml</destinationFile>
  </fileSet>                
</fileSets>

Кроме того, вы можете указать несколько выполнений в несколько этапов, если необходимо, вторая цель - «переименовать», которая просто делает то, что говорит, в то время как остальная часть конфигурации остается прежней. Дополнительные примеры использования см. На странице использования .

Примечание : Этот плагин может копировать только файлы, но не каталоги. (Спасибо @ james.garriss за то, что нашли это ограничение.)

6 голосов
/ 23 апреля 2009

Приведенное выше решение для муравья проще всего настроить, но мне повезло с помощью maven-upload-plugin от Atlassian. Мне не удалось найти хорошую документацию, вот как я ее использую:

<build>
  <plugin>
    <groupId>com.atlassian.maven.plugins</groupId>
    <artifactId>maven-upload-plugin</artifactId>
    <version>1.1</version>
    <configuration>
       <resourceSrc>
             ${project.build.directory}/${project.build.finalName}.${project.packaging}
       </resourceSrc>
       <resourceDest>${jboss.deployDir}</resourceDest>
       <serverId>${jboss.host}</serverId>
       <url>${jboss.deployUrl}</url>
     </configuration>
  </plugin>
</build>

Переменные типа "$ {jboss.host}", на которые есть ссылки выше, определены в моем ~ / .m2 / settings.xml и активируются с помощью профилей maven. Это решение не ограничено JBoss, это то, что я назвал своими переменными. У меня есть профиль для dev, test и live. Поэтому, чтобы загрузить свое ухо в экземпляр jboss в тестовой среде, я должен выполнить:

mvn upload:upload -P test

Вот фрагмент из файла settings.xml:

<server>
  <id>localhost</id>
  <username>username</username>
  <password>{Pz+6YRsDJ8dUJD7XE8=} an encrypted password. Supported since maven 2.1</password>
</server>
...
<profiles>
  <profile>
    <id>dev</id>
    <properties>
      <jboss.host>localhost</jboss.host> 
      <jboss.deployDir>/opt/jboss/server/default/deploy/</jboss.deployDir>
      <jboss.deployUrl>scp://root@localhost</jboss.deployUrl>
    </properties>
  </profile>
  <profile>
    <id>test</id>
    <properties>
       <jboss.host>testserver</jboss.host>
       ...

Примечания: Репозиторий Atlassian Maven с этим плагином находится здесь: https://maven.atlassian.com/public/

Я рекомендую скачать исходники и просмотреть документацию внутри, чтобы увидеть все функции, которые предоставляет плагин.

`

5 голосов
/ 06 марта 2009

Что ж, maven не должен хорошо выполнять тонкие гранулярные задачи, это не язык сценариев, такой как bash или ant, он скорее декларативный - вы говорите - мне нужна война или ухо, и вы получите это , Однако, если вам нужно настроить, как должна выглядеть война или слух, у вас есть проблема. Это просто не процедурный, как муравей, а декларативный. У этого есть некоторые плюсы в начале, и может быть много минусов в конце.

Я предполагаю, что первоначальная концепция заключалась в том, чтобы иметь прекрасные плагины, которые "просто работают", но реальность другая, если вы делаете нестандартные вещи.

Однако, если вы приложите достаточно усилий к своим poms и нескольким настраиваемым плагинам, вы получите гораздо лучшую среду сборки, как, например, с ant (конечно, это зависит от вашего проекта, но оно становится все более актуальным для больших проектов) .

4 голосов
/ 26 февраля 2017

Обычный способ копирования произвольных файлов - это использование Maven Wagon транспортной абстракции. Он может обрабатывать различные пункты назначения через протоколы, такие как file, HTTP, FTP, SCP или WebDAV.

Существует несколько плагинов, которые предоставляют средства для копирования файлов с помощью Wagon. Самые известные из них:

  • Готовый Подключаемый модуль Maven Deploy

    Есть цель deploy-file. Это довольно негибко, но можно сделать работу:

    mvn deploy:deploy-file -Dfile=/path/to/your/file.ext -DgroupId=foo 
    -DartifactId=bar -Dversion=1.0 -Durl=<url> -DgeneratePom=false
    

    Существенным недостатком использования Maven Deploy Plugin является то, что он предназначен для работы с репозиториями Maven. Это предполагает особую структуру и метаданные. Вы можете видеть, что файл находится под foo/bar/1.0/file-1.0.ext и файлы контрольной суммы созданы. Обойти это невозможно.

  • Плагин Wagon Maven

    Используйте upload-single цель :

    mvn org.codehaus.mojo:wagon-maven-plugin:upload-single
    -Dwagon.fromFile=/path/to/your/file.ext -Dwagon.url=<url>
    

    Использование Wagon Maven Plugin для копирования является простым и, кажется, наиболее универсальным.


В приведенных выше примерах <url> может иметь любой поддерживаемый протокол. См. Список существующих провайдеров вагонов . Например

  • локальное копирование файла: file:///copy/to
  • копирование файла на удаленный хост под управлением SSH: scp://host:22/copy/to


Приведенные выше примеры передают параметры плагина в командной строке. Кроме того, плагины могут быть настроены непосредственно в POM. Тогда вызов будет просто похож на mvn deploy:deploy-file@configured-execution-id. Или это может быть связано с определенной фазой сборки.


Обратите внимание, что для работы таких протоколов, как SCP, вам необходимо определить расширение в POM:

<build>
  [...]
  <extensions>
    <extension>
      <groupId>org.apache.maven.wagon</groupId>
      <artifactId>wagon-ssh</artifactId>
      <version>2.12</version>
    </extension>
  </extensions>


Если место назначения, в которое вы копируете, требует аутентификации, учетные данные могут быть предоставлены через Server settings . repositoryId / serverId передаваемые плагинам должны соответствовать серверу, указанному в настройках.

4 голосов
/ 29 марта 2013

У меня был очень хороший опыт работы с copy-maven-plugin . У него гораздо более удобный и лаконичный синтаксис по сравнению с плагином maven-resources.

3 голосов
/ 25 февраля 2009

Я могу только предположить, что ваше свойство $ {project.server.config} определено пользователем и находится за пределами стандартной структуры каталогов.

Если так, то я бы использовал задачу копирования.

...