如何在共享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在需要时轻松覆盖,且满足以下要求:
- 默认值由Shared Assembly Project定义
- 引用项目使用默认值时无需额外配置
- 引用项目覆盖默认值时操作简单,无需额外插件
解决方案
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
相关产品推荐
相关产品推荐

