在 Maven 程序集中复制文件

use*_*605 7 maven maven-assembly-plugin

我正在构建一个 Maven 程序集。结构是这样的:

src
  main
    server
      app1
      app2
      app3
    client
      app1
      app2
      app3
    common
      server.xml
Run Code Online (Sandbox Code Playgroud)

该程序集的输出为:

server.zip
  app1
  app2
  app3
Run Code Online (Sandbox Code Playgroud)

我想包含server.xml在应用程序的每个输出文件夹中。所以我的输出应该是:

server.zip
  app1
    server.xml  
  app2
    server.xml  
  app3
    server.xml
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Tun*_*aki 8

您需要通过server.xmlassembly.xml. 这是一个示例程序集描述符:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
    <id>server</id>
    <formats>
        <format>zip</format>
    </formats>
    <fileSets>
        <fileSet>
            <directory>src/main/server/app1</directory>
            <outputDirectory>app1</outputDirectory>
        </fileSet>
    </fileSets>
    <files>
        <file>
            <source>src/main/common/server.xml</source>
            <outputDirectory>app1</outputDirectory>
        </file>
    </files>
    <!-- same configuration for app2 and 3 -->
</assembly>
Run Code Online (Sandbox Code Playgroud)

如果您想循环执行此操作(假设您有 50 个应用程序文件夹),则可以使用Velocity 模板生成正确的 Maven 程序集描述符。调用 Velocity 是通过velocity-maven-plugin.

样本速度模板(另存为src/main/common/assembly-server.xml.vm):

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
    <id>server</id>
    <formats>
        <format>zip</format>
    </formats>
    <fileSets>
        #foreach($i in [1..50])
        <fileSet>
            <directory>src/main/server/app$i</directory>
            <outputDirectory>app$i</outputDirectory>
        </fileSet>
        #end
    </fileSets>
    <files>
        #foreach($i in [1..50])
        <file>
            <source>src/main/common/server.xml</source>
            <outputDirectory>app$i</outputDirectory>
        </file>
        #end
    </files>
</assembly>
Run Code Online (Sandbox Code Playgroud)

插件配置:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
    <id>server</id>
    <formats>
        <format>zip</format>
    </formats>
    <fileSets>
        #foreach($i in [1..50])
        <fileSet>
            <directory>src/main/server/app$i</directory>
            <outputDirectory>app$i</outputDirectory>
        </fileSet>
        #end
    </fileSets>
    <files>
        #foreach($i in [1..50])
        <file>
            <source>src/main/common/server.xml</source>
            <outputDirectory>app$i</outputDirectory>
        </file>
        #end
    </files>
</assembly>
Run Code Online (Sandbox Code Playgroud)

这将生成一个assembly-server.xml文件target,您可以将其用作maven-assembly-plugin.