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