使用Maven复制文件的最佳实践

213
我有一些配置文件和各种文档,希望使用Maven2将它们从开发环境复制到dev-server目录。奇怪的是,Maven在这个任务上似乎不够强大。
一些选项:
- 简单地在Maven中使用任务。
<copy file="src/main/resources/config.properties" tofile="${project.server.config}/config.properties"/>
  • 使用Ant插件执行copy

    • 构建类型为zip的artifact,与POM的“main”artifact通常为jar的类型并行,然后将该artifact从存储库解压缩到目标目录中。

    • maven-resources插件,如下所述。

    • Maven Assembly插件 - 但这似乎需要大量手动定义,当我想简单和“传统”地做事情时。

    • 此页面甚至展示了如何构建插件来进行复制!

    • maven-upload插件,如下所述。

    • maven-dependency-plugincopy,如下所述。


所有这些都似乎是不必要的:Maven应该擅长在没有麻烦和烦恼的情况下完成这些标准任务。

有什么建议吗?


3
Maven建立在生命周期和阶段概念基础之上,将随机复制文件到远程服务器这一任务并不符合此概念。始终将您的项目作为一个整体来考虑。 - André
3
这些似乎过于临时应急了:Maven 的优势在于毫不费力地完成这些标准任务。而你正在做的并不是一个标准任务。如果你的构件是 war/ear 文件,那么使用 cargo 插件(cargo.codehaus.org/Maven2+plugin#Maven2plugin-get…)就可以简单地完成。你所描述的听起来是高度针对你的部署方式而非标准的 Java 应用程序容器部署。Maven 实际上并不适合处理向实时服务器进行部署活动 - 它更适合构建/开发活动。 - whaley
76
@André: 我一遍又一遍听到这个论点,但抱歉,那是胡说八道。考虑整体项目没有问题,但任何像样的构建系统的一部分应该是让我能够以简单明了的方式完成任务X的功能,例如复制文件,而Maven做不到这一点。近来出现了许多采用构建脚本即代码范例的项目(如Gradle、SBT或Buildr)之所以如此,是有原因的。 - mxk
我建议为构建工件和部署给定工件分别拥有一个pom.xml。 - Thorbjørn Ravn Andersen
以上所有建议似乎仍然不能让我将不同项目/构件中的特定文件复制到一个maven项目中。我有一些文件在一个构件的src/main/folder下,这个构件变成了一个jar包。我尝试使用dependency-copy maven插件,但是我没有找到一种方法来指定我想要复制哪些文件,每次都会在assembly文件中得到整个jar文件。所有其他建议,如资源,似乎都不允许我指定一个构件而不是项目内的资源。 - Alexandre Thenorio
14个回答

2
如果有人想要完全控制源路径和目标路径,那么使用maven-antrun-plugincopy任务是最好的选择。这种方法可以让你在系统上复制任何路径,无论相关路径是否在mvn项目内部。我曾经遇到过一种情况,需要将生成的源文件从target目录复制回src目录以进行进一步处理。在我的情况下,这是唯一一个不费吹灰之力就能工作的选项。以下是pom.xml中的示例代码片段:
<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>1.8</version>
        <executions>
            <execution>
                <phase>process-resources</phase>
                <configuration>
                <tasks>
                    <copy file="${basedir}/target/myome/minifyJsSrcDir/myome.min.js" todir="${basedir}/src/main/webapp/app/minifyJsSrcDir"/>
                </tasks>
                </configuration>
                <goals>
                <goal>run</goal>
                </goals>
            </execution>
        </executions>
</plugin>

2

另一种方法是使用assembly插件将这些内容打包成一个artifact。然后,您可以使用dependency插件在需要的位置解压缩这些文件。还有dependency插件中的复制目标可用于复制artifact。


1

我能够从许多不同的来源中拼凑出这个答案:

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


-1
总结一下上面的一些好答案:Maven旨在构建模块并将结果复制到Maven存储库中。任何将模块复制到部署/安装程序输入目录的操作都必须在Maven核心功能之外完成,例如使用Ant/Maven copy命令。

Ant属于Maven的核心功能,Wagon也是如此(尽管围绕它的插件不是官方的Maven核心插件)。 - Gerold Broser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接