Рекомендации по копированию файлов с помощью Maven



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





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




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



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





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


  • построить артефакт типа zip, наряду с" главным " артефактом POM, который обычно имеет тип jar, потом распакуйте этот артефакт из хранилища в целевой каталог.


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


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


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


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


  • Maven-dependency-plugin С скопировать, как указано ниже.





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



какие-либо советы?

845   13  

13 ответов:

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

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

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

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

для того, чтобы скопировать воспользоваться файл:

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

плагин зависимости 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>

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

для простого копирования-задачи я могу порекомендовать копировать-переименовать-maven-плагин. Это прямо вперед и простой в использовании:

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

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

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

решение ant выше проще всего настроить, но мне повезло с использованием 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.хост}", упомянутые выше, определены в my ~/.м2/настройки.xml и активируются с помощью профилей maven. Это решение не ограничено JBoss, это просто то, что я назвал мои переменные. У меня есть профиль для dev, test и live. Поэтому, чтобы загрузить мое ухо в a экземпляр jboss в тестовой среде я бы выполнил:

mvn upload:upload -P test

вот снипет из настроек.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/

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

'

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

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

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

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

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

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

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

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

  • из-из-коробки Maven Deploy Plugin

    есть 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 и создаются файлы контрольной суммы. С этим ничего не поделаешь.

  • Универсал 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 настройки. repositoryId/serverId переданные Плагины должны соответствовать серверу, определенному в настройках.

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

я смог собрать воедино несколько различных источников для этого ответа:

...
<repository>
    <id>atlassian</id>
    <name>Atlassian Repo</name>
    <url>https://maven.atlassian.com/content/repositories/atlassian-public</url>
</repository>
...
<dependency>
    <groupId>com.atlassian.maven.plugins</groupId>
    <artifactId>maven-upload-plugin</artifactId>
    <version>1.1</version>
</dependency>
...
<plugin>
    <groupId>com.atlassian.maven.plugins</groupId>
    <artifactId>maven-upload-plugin</artifactId>
    <version>1.1</version>
    <configuration>
        <serverId>jira-repo</serverId>
        <resourceSrc>
            ${project.build.directory}/${project.build.finalName}.${project.packaging}
        </resourceSrc>
        <resourceDest>opt/jira/webapps</resourceDest> <!-- note: no leading slash -->
        <url>scp://root@jira</url>
    </configuration>
</plugin>
...

С ~/.m2/settings.xml:

...
<servers>
  <server>
    <id>jira-repo</id>
    <username>myusername</username>
    <password>mypassword</password>
  </server>
</servers>
...

затем выполните команду: (- X для отладки)

mvn -X upload:upload

чтобы суммировать некоторые из прекрасных ответов выше:Maven предназначен для построения модулей и копирования результатов в репозиторий Maven. Любое копирование модулей в каталог deployment / installer-input должно выполняться вне контекста основных функций Maven, например, с помощью Ant / Maven скопировать.

    Ничего не найдено.

Добавить ответ:
Отменить.