You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在子Maven pom.xml中过滤依赖资源文件?(含父pom配置)

在子Maven pom.xml中过滤依赖资源文件的方案

嘿,针对你这个父pom通过maven-assembly-plugin引用build-tools模块里的assembly配置的场景,我有几个实用的方案可以帮你在子pom里实现依赖资源文件的过滤,咱们一步步来看:

方案1:直接在子pom中扩展assembly插件配置

你可以在子pom里重新定义maven-assembly-plugin的执行配置,添加过滤规则,同时保留对build-tools中build.xml的引用。这样既能复用父pom的基础配置,又能自定义子项目的过滤逻辑:

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>3.1.0</version>
  <!-- 保留对build-tools模块的依赖,确保能加载到build.xml -->
  <dependencies>
    <dependency>
      <groupId>com.company</groupId>
      <artifactId>build-tools</artifactId>
      <version>1.2.7-SNAPSHOT</version>
    </dependency>
  </dependencies>
  <executions>
    <execution>
      <id>build</id>
      <goals>
        <goal>single</goal>
      </goals>
      <configuration>
        <!-- 指定使用build-tools里的assembly descriptor -->
        <descriptors>
          <descriptor>build.xml</descriptor>
        </descriptors>
        <!-- 配置过滤文件(比如属性文件) -->
        <filters>
          <filter>${project.basedir}/src/main/filters/child-filter.properties</filter>
        </filters>
        <!-- 针对特定资源开启过滤,这里以src/main/resources下的properties文件为例 -->
        <fileSets>
          <fileSet>
            <directory>src/main/resources</directory>
            <outputDirectory>/</outputDirectory>
            <filtered>true</filtered>
            <includes>
              <include>**/*.properties</include>
            </includes>
          </fileSet>
        </fileSets>
      </configuration>
    </execution>
  </executions>
</plugin>

注意:如果父pom已经在<pluginManagement>中声明了assembly插件的基础配置,子pom可以省略版本号和依赖部分,直接添加自定义的<configuration>和<executions>即可。

方案2:参数化build-tools中的assembly descriptor

如果build-tools模块里的build.xml支持参数化,你可以在子pom中传递过滤相关的属性,让descriptor动态应用子项目的过滤规则:

首先,修改build-tools里的build.xml,引入变量占位符:

<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
  <id>dist</id>
  <formats>
    <format>zip</format>
  </formats>
  <!-- 使用变量引用过滤文件 -->
  <filters>
    <filter>${child.filter.file}</filter>
  </filters>
  <fileSets>
    <fileSet>
      <directory>src/main/resources</directory>
      <outputDirectory>/</outputDirectory>
      <!-- 开启过滤 -->
      <filtered>true</filtered>
    </fileSet>
  </fileSets>
</assembly>

然后在子pom中定义属性并传递给插件:

<!-- 定义子项目的过滤文件路径 -->
<properties>
  <child.filter.file>${project.basedir}/src/main/filters/child-specific.properties</child.filter.file>
</properties>

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>3.1.0</version>
  <dependencies>
    <dependency>
      <groupId>com.company</groupId>
      <artifactId>build-tools</artifactId>
      <version>1.2.7-SNAPSHOT</version>
    </dependency>
  </dependencies>
  <executions>
    <execution>
      <id>build</id>
      <goals>
        <goal>single</goal>
      </goals>
      <configuration>
        <descriptors>
          <descriptor>build.xml</descriptor>
        </descriptors>
        <!-- 将属性传递给assembly descriptor -->
        <properties>
          <child.filter.file>${child.filter.file}</child.filter.file>
        </properties>
      </configuration>
    </execution>
  </executions>
</plugin>

方案3:创建子项目专属的assembly descriptor

如果不想修改父pom或build-tools的配置,你可以在子项目中创建自己的assembly descriptor,引入build-tools里的build.xml,然后添加自定义的过滤规则:

首先,在子项目中创建src/main/assembly/child-assembly.xml:

<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
  <!-- 引入build-tools里的基础assembly配置 -->
  <include>build.xml</include>
  <!-- 添加子项目专属的过滤规则 -->
  <filters>
    <filter>${project.basedir}/src/main/filters/child-filter.properties</filter>
  </filters>
  <!-- 覆盖或补充资源集配置,开启过滤 -->
  <fileSets>
    <fileSet>
      <directory>src/main/resources</directory>
      <outputDirectory>/</outputDirectory>
      <filtered>true</filtered>
      <includes>
        <include>**/*.xml</include>
        <include>**/*.properties</include>
      </includes>
    </fileSet>
  </fileSets>
</assembly>

然后在子pom中配置插件指向这个自定义的descriptor:

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>3.1.0</version>
  <dependencies>
    <dependency>
      <groupId>com.company</groupId>
      <artifactId>build-tools</artifactId>
      <version>1.2.7-SNAPSHOT</version>
    </dependency>
  </dependencies>
  <executions>
    <execution>
      <id>build</id>
      <goals>
        <goal>single</goal>
      </goals>
      <configuration>
        <descriptors>
          <descriptor>${project.basedir}/src/main/assembly/child-assembly.xml</descriptor>
        </descriptors>
      </configuration>
    </execution>
  </executions>
</plugin>

关键注意点

  • 确保assembly插件的<filtered>true</filtered>属性已开启,否则资源过滤不会生效。
  • 确认build-tools模块已将build.xml正确打包到jar中(可以在build-tools的pom里通过<resources>配置包含该文件)。
  • Maven的资源过滤默认只处理src/main/resources下的文件,若需过滤其他路径的资源,需在<fileSets>中明确指定。

内容的提问来源于stack exchange,提问作者louis amoros

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:06:10