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

如何在共享Maven装配文件中设置默认值并允许引用项目覆盖

Maven共享装配文件的属性默认值与覆盖解决方案

我有一个名为Shared Assembly Project的Maven项目,定义了如下装配文件:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/2.2.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/2.2.0 http://maven.apache.org/xsd/assembly-2.2.0.xsd">
    <id>shared-assembly</id>
    <includeBaseDirectory>false</includeBaseDirectory>
    <formats>
        <format>zip</format>
    </formats>
    <fileSets>
        <fileSet>
            <directory>${schema.directory}</directory>
            <outputDirectory>schemas</outputDirectory>
        </fileSet>
    </fileSets>
</assembly>

该文件位于src/main/resources/assemblies/shared-assembly.xml,其他Referencing Project可以通过在POM中依赖该项目并引用descriptorRef来使用这个装配配置:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>${maven-assembly-plugin.version}</version>
    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>shared-assembly</artifactId>
            <version>${shared.assembly.version}</version>
        </dependency>
    </dependencies>
    <configuration>
        <descriptorRefs>
            <descriptorRef>shared-assembly</descriptorRef>
        </descriptorRefs>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

现在的问题是:shared-assembly.xml中的${schema.directory}需要由Shared Assembly Project指定默认值,同时允许Referencing Project在需要时轻松覆盖,且满足以下要求:

  1. 默认值由Shared Assembly Project定义
  2. 引用项目使用默认值时无需额外配置
  3. 引用项目覆盖默认值时操作简单,无需额外插件

解决方案

1. 为Shared Assembly Project设置默认值

在Shared Assembly Project的pom.xml中完成以下配置,确保装配文件打包时已注入默认路径:

  • 定义默认属性:
    <properties>
        <!-- 这里设置schema目录的默认值 -->
        <schema.directory>target/generated-sources/schema</schema.directory>
    </properties>
    
  • 开启资源过滤,将装配文件中的${schema.directory}替换为默认值后打包:
    <build>
        <resources>
            <resource>
                <directory>src/main/resources/assemblies</directory>
                <filtering>true</filtering>
                <includes>
                    <include>shared-assembly.xml</include>
                </includes>
            </resource>
        </resources>
    </build>
    

完成以上配置后,Shared Assembly Project打包时,装配文件中的${schema.directory}会被替换为默认路径。Referencing Project直接使用descriptorRef引用时,会自动采用这个默认值,无需额外配置,满足目标1和2。

2. Referencing Project覆盖默认值的方法

如果需要自定义schema目录,只需在引用项目中创建一个极简的自定义装配描述符,复用共享装配的核心配置,仅修改directory即可:

  • 在Referencing Project的src/main/resources/assemblies下创建custom-shared-assembly.xml:
    <assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/2.2.0"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/2.2.0 http://maven.apache.org/xsd/assembly-2.2.0.xsd">
        <id>shared-assembly</id>
        <includeBaseDirectory>false</includeBaseDirectory>
        <formats>
            <format>zip</format>
        </formats>
        <fileSets>
            <fileSet>
                <!-- 这里替换为你的自定义路径 -->
                <directory>${project.basedir}/src/main/schemas</directory>
                <outputDirectory>schemas</outputDirectory>
            </fileSet>
        </fileSets>
    </assembly>
    
  • 修改Referencing Project的assembly插件配置,使用自定义描述符替代descriptorRef:
    <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>${maven-assembly-plugin.version}</version>
        <configuration>
            <descriptors>
                <descriptor>src/main/resources/assemblies/custom-shared-assembly.xml</descriptor>
            </descriptors>
        </configuration>
        <executions>
            <execution>
                <id>make-assembly</id>
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    

这种方式无需额外插件,仅需创建一个简短的自定义装配文件即可完成覆盖,操作简单,满足目标3。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:24:55