最佳做法的复制文件与家
-
06-09-2019 - |
题
我有配置文件和各种文件,我想要复制开发环境的开发服务器目录使用Maven2.奇怪的是,专家似乎并不强在这一任务。
一些选择:
- 简单的使用 复制 任务在家
<copy file="src/main/resources/config.properties" tofile="${project.server.config}/config.properties"/>
用蚂蚁插件执行 复制 从蚂蚁。
构建一个项目的类型 拉链, 与"主"的神器POM,这是通常的类型 罐子, 然后 unpack 那个神器从储存库为目标目录。
专家资源 插件,如下面提到。
专家会插件--但这似乎需要大量的手册的定义,当我想要做的事情简单地和"传统上."
这页 甚至可以显示如何建立一个插件做复制的!
专家-上传 插件,如下面提到。
专家-依赖-插件 与 复制, 如下面提到。
所有这些似乎毫无必要地问题特设:家应该擅长做这些标准的任务没有大惊小怪和麻烦。
任何建议?
解决方案
不要回避的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>
在回答这个问题,我注重细节什么你要求。我怎么复制一文件?问题和变量名称引领我到一个更大的问题,如:"是否有更好的方式来处理服务器供应?" 使用专家作为一个建立系统以产生可部署的项目,然后执行这些定义在独立的模块或者别的地方完全。如果你分享一点你的生成环境,可能有一个更好的方式-有插件提供一个服务器数量。你可以附加大会,是解开服务器的根吗?什么样的服务器你都用?
再次,我肯定有一个更好的办法。
其他提示
<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>
该专家的依赖性的插件救了我很多的时间抚摸蚁任务:
<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,并有更多的有用的目标,如解包。
对于一个简单的复制任务,可以推荐我 复制重新命名-玛文件.这是直截了当和简单的使用:
<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>
此外,您可以指定多个执行在多个阶段,如果需要,第二个目标是"重新命名",这只是没什么说的话,其余的配置保持不变。对更多的使用情况的实例请参阅 使用情况的一页.
注意到:这个插件只能复制文件,没有目录。(由于@詹姆斯。garriss为了找到这个的限制。)
蚂蚁解决上述最容易配置,但是我必须运用专家-传-插件的讨论大多数集中.我无法找到良好的文件,这是我如何使用它:
<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>
变量,如"${boss.主}"参考上述定义在我~/.m2/settings.xml 并且激活使用专家的概况。这个方案是不受约束的要Boss,这正是我叫我的变量。我有一个轮廓,用于开发、测试和生活。以上我的耳朵一个boss实例在测试环境,我将执行:
mvn upload:upload -P test
这里是一个snipet从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>
...
注:该讨论大多数集中专家的回购,有这个插件是: https://maven.atlassian.com/public/
我建议下载来源,并寻找在本文件里看到的所有特性的插件提供。
`
好的,专家不应该是良好的做细颗粒状的任务,它不是一个脚本语言喜欢庆典或蚂蚁,而是声明性的-你说-我需要一个战争,或者一个耳朵,你会得到它。但是如果你需要定义的战争或是耳朵看起来应该像里面,你有问题。它不仅仅是程序性的像蚂蚁,但声明。这有一些优点在开始,并且可能有很大的弊端。
我猜最初的概念是具有良好的插件,这"仅仅是工作",但现实是不同的,如果你做的非标准的东西。
但是如果你把足够的努力在你的劲歌和一些定义插件,你会得到一个更好的建造环境作用蚂蚁例如(取决于你的项目的课程,但它得到更多和更真实的更大的项目)。
我已经有非常良好的经验 复制-玛文件.它有一个更方便和简洁的语法相比,家资源插件。
一个通用的方法来复制任意的文件是以利用 专家旅行车 运输抽象概念。它可以处理各种目的通过议定书喜欢 file
, HTTP
, FTP
, SCP
或 WebDAV
.
有几个插件,提供设施,复制文件通过使用 Wagon
.最值得注意的是:
开箱子 专家部署的插件
还有就是
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
是,它是指定的工作与专家库。它具有特别结构和元数据。你可以看到,该文件被放置在foo/bar/1.0/file-1.0.ext
和验和文件被创建。有没有办法解决这个问题。车家插件
使用
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
通过的插件必须与服务器定义中的设置。
我只能假设你${的项目。服务器。config}酒店是什么的定义和外的标准目录的布局。
如果是这样,然后我会使用复制的任务。
另一种方式是要束这些东西进入一个项目使用的组件。然后你就可以使用的依赖性的插件来解开这些文件,你想在哪里。也有副本的目标,在依赖性的插件复制的文物。
我能够拼凑出一些不同的来源为这个回答:
...
<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
总结的一些细答复: 行家 目的是建立模块和复制的结果给一个专家库。任何复制的模块的部署/安装-输入目录必须做到的范围之外行家的核心功能,例如与Ant/家 复制 命令。