8

复制资源和重命名它们很容易使用org.apache.maven.plugins:maven-antrun-plugin,但是有没有办法使用通配符或其他机制智能地做到这一点,以符合个人规则?

例如,如果我有这些文件:

  • ${project.artifactId}-${project.version}.swf
  • a.swf
  • b.swf
  • ...
  • z.swf

我想将所有这些文件复制到目录中并仅重命名${project.artifactId}-${project.version}.swffoo.swf. 我知道我可以使用:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.7</version>
       <executions>
          <execution>
             <id>copy-swf-files</id>
             <phase>compile</phase>
                <goals>
                   <goal>run</goal>
                </goals>
                <configuration>
                   <target name="copy swf files to web project">
                       <copy file="${project.build.directory}/${project.artifactId}-${project.version}.swf" tofile="${swf.output.location}/foo.swf" />
                       <copy file="${project.build.directory}/a.swf" tofile="${swf.output.location}/a.swf" />
                       <copy file="${project.build.directory}/z.swf" tofile="${swf.output.location}/z.swf" />
                    </target>
                 </configuration>                       
              </execution>
           </executions>
     </plugin>

这是工作,但有没有另一种方便的方法来做到这一点,因为如果我有 1000 个文件要复制,那会很无聊......谢谢

4

3 回答 3

16

你知道蚂蚁吗?Maven Ant 插件所做的所有事情就是使用您列出的任务调用 Ant。您可以执行任何 Ant 任务,包括<taskdef>等。

看起来你正在做的事情可以用文件集来完成:

 <copy todir="${swf.output.location}">
    <fileset dir="${project.build.directory}">
        <include name="*.swf"/>
    </fileset>
</copy>

这会将*.swf直接位于${project.build.directory}(并且没有子目录)下的所有文件复制到${swf.output.location}目录中。如果要复制文件的整个目录树*.swf,只需更改<include>

 <copy todir="${swf.output.location}">
    <fileset dir="${project.build.directory}">
        <include name="**/*.swf"/>  <!--NOTE DIFFERENCE HERE-->
    </fileset>
</copy>

如果您需要修改文件名,可以使用Mappers。最简单的映射器是 flatten 映射器:

 <copy todir="${swf.output.location}">
    <fileset dir="${project.build.directory}">
        <include name="**/*.swf"/>  <!--NOTE DIFFERENCE HERE-->
    </fileset>
    <mapper type="flatten"/>
</copy>

这将复制整个目录树并将所有文件展平到一个目录中。有些映射器可以匹配 glob、正则表达式甚至脚本。

<include>是一个选择器而不是一个映射器,因为它选择了您想要操作的文件。这些也可能非常复杂,您可以根据它们的名称 iva 正则表达式甚至它们的内容来匹配文件。

我很惊讶没有允许您执行此操作的 Maven 插件。

于 2013-04-18T21:01:40.517 回答
4

好的,我终于用这个插件来做到这一点:

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-antrun-plugin</artifactId>
   <version>1.7</version>
   <executions>
      <execution>
      <id>copy-swf-files</id>
      <phase>compile</phase>
      <goals>
         <goal>run</goal>
      </goals>
      <configuration>
         <target name="copy swf files to web project">      
            <copy todir="${swf.output.location}">
                <fileset dir="${project.build.directory}" includes="*.swf">
                    <filename regex="^sim-flex.*"/>
                </fileset>
            <mapper type="regexp" from=".*" to="sim.swf"/>
            </copy>
            <copy todir="${swf.output.location}" >
                <fileset dir="${project.build.directory}" includes="*.swf">
                    <not>
                        <filename regex="^sim-flex.*"/>
                    </not>                                  
                </fileset>
            </copy>
         </target>
      </configuration>                       
   </execution> 
 </executions>
</plugin>
于 2013-04-19T08:27:55.867 回答
1

使用带有“dir”“formats/format”的程序集描述符的 maven-assembly-plugin,一个“fileSets/fileSet”,它将复制除特殊 swf 之外的大部分 swf,以及一个“files/file”,它将复制一个 swf 到具有不同名称的文件。

于 2013-04-18T20:48:16.313 回答