重写目标路径和文件名

解压文件时,可以在目标文件夹中重写每个解压文件的目标路径和文件名。这很有用,例如添加或删除前缀(如删除顶级文件夹等):

<project>
   [...]
   <build>
     <plugins>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-dependency-plugin</artifactId>
         <version>3.3.0</version>
         <executions>
           <execution>
             <id>unpack</id>
             <phase>package</phase>
             <goals>
               <goal>unpack</goal>
             </goals>
             <configuration>
               [...]
               <artifactItems>
                 <artifactItem>
                   [...]
                   <fileMappers>
                     <org.codehaus.plexus.components.io.filemappers.RegExpFileMapper>
                       <pattern>^\Qx.y/z/\E</pattern>
                       <replacement>./</replacement>
                     </org.codehaus.plexus.components.io.filemappers.RegExpFileMapper>
                   </fileMappers>
                   [...]
                 </artifactItem>
               </artifactItems>
               [...]
             </configuration>
           </execution>
         </executions>
       </plugin>
     </plugins>
   </build>
   [...]
 </project>

x.y/z/上面的示例使用正则表达式和替换表达式有效地删除了每个解压缩文件路径的前缀。这里需要使用两个技巧:首先,正则表达式使用\Qand\E来划分模式引用,因为点 ( .) 是正则表达式中的特殊字符。其次,由于 Maven 的 POM 语法的限制,替换不能为空(这会跳过文件)。相反,使用点斜杠 ( ./) 替换,这实际上是路径段的无操作。

任何 Plexus File Mapper(即接口的实现org.codehaus.plexus.components.io.filemappers.FileMapper)都可以使用,但有三个特别有用。

正则表达式映射器可用于修改或删除前缀或后缀,或重写文件扩展名:

 [...]
 <org.codehaus.plexus.components.io.filemappers.RegExpFileMapper>
   <pattern>[...]</pattern>
   <replacement>[...]</replacement>
 </org.codehaus.plexus.components.io.filemappers.RegExpFileMapper>
 [...]

前缀文件映射器对于添加前缀很有用:

 [...]
 <org.codehaus.plexus.components.io.filemappers.PrefixFileMapper>
   <prefix>[...]</prefix>
 </org.codehaus.plexus.components.io.filemappers.PrefixFileMapper>
 [...]

Flatten File Mapper 完全删除了路径,有效地将所有文件放在同一个文件夹中:

 [...]
 <org.codehaus.plexus.components.io.filemappers.FlattenFileMapper/>
 [...]

当给定多个文件映射器时,列表从上到下执行。与使用单一(通常是复杂的)正则表达式相比,这可能会提高整体重写操作的可读性。