Вопрос

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


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

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

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

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

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

  • maven-ресурсы плагин, как упомянуто ниже.

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

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

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

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


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

Есть какой-нибудь совет?

Это было полезно?

Решение

Не уклоняйтесь от плагина 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>3.1.0</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 сэкономил мне много времени на работу с ant-задачами:

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

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

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

Описанное выше решение 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.host}", упомянутые выше, определены в my ~/.m2/settings.xml и активируются с помощью профилей maven.Это решение не ограничено JBoss, это просто то, как я назвал свои переменные.У меня есть профиль для разработчиков, тестирования и live.Итак, чтобы загрузить мой ear в экземпляр 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/

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

`

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

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

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

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

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

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

  • Готовый к использованию Плагин развертывания Maven

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

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

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

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

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

...
<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.Любое копирование модулей в каталог deployment /installer-input должно выполняться вне контекста основной функциональности Maven, напримерс помощью Ant /Maven Копировать команда.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top