Maven Assembly Plugin如何合并Jersey AutoDiscoverable的SPI配置?
解决Maven Assembly Plugin合并services文件的问题
Maven Assembly Plugin默认处理重复文件时会采用覆盖策略,这就是你的META-INF/services/org.glassfish.jersey.internal.spi.AutoDiscoverable文件只保留单个条目的原因。要实现不同工件中该文件内容的合并,需要自定义Assembly描述符文件并配置文件合并规则。
步骤1:创建自定义Assembly描述符文件
在项目的src/main/assembly目录下创建jar-with-dependencies.xml文件,内容如下:
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 http://maven.apache.org/xsd/assembly-2.1.0.xsd"> <id>jar-with-dependencies</id> <formats> <format>jar</format> </formats> <includeBaseDirectory>false</includeBaseDirectory> <dependencySets> <dependencySet> <outputDirectory>/</outputDirectory> <useProjectArtifact>true</useProjectArtifact> <unpack>true</unpack> <scope>runtime</scope> <fileMergeStrategies> <!-- 针对目标services文件配置合并策略 --> <fileMergeStrategy> <regex>META-INF/services/org.glassfish.jersey.internal.spi.AutoDiscoverable</regex> <strategy>merge</strategy> </fileMergeStrategy> <!-- 其余文件保持默认覆盖策略 --> <fileMergeStrategy> <regex>.*</regex> <strategy>replace</strategy> </fileMergeStrategy> </fileMergeStrategies> </dependencySet> </dependencySets> <archive> <manifestEntries> <Multi-Release>true</Multi-Release> </manifestEntries> </archive> </assembly>
如果需要合并所有META-INF/services/下的文件,可以把第一个<regex>改成META-INF/services/.*。
步骤2:修改Assembly插件配置
将原来使用默认jar-with-dependencies描述符的配置,替换为使用自定义描述符:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.1.1</version> <executions> <execution> <id>assemble-all</id> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <!-- 替换为自定义描述符 --> <descriptors> <descriptor>src/main/assembly/jar-with-dependencies.xml</descriptor> </descriptors> <archive> <manifestEntries> <Multi-Release>true</Multi-Release> </manifestEntries> </archive> </configuration> </execution> <execution> <id>assemble-dist-zip</id> <phase>verify</phase> <goals> <goal>single</goal> </goals> <configuration> <appendAssemblyId>false</appendAssemblyId> <descriptors> <descriptor>src/main/assembly/app-zip-assemble.xml</descriptor> </descriptors> </configuration> </execution> </executions> </plugin>
原理说明
自定义描述符中通过<fileMergeStrategy>指定了目标文件的合并策略:
merge策略会将多个同名文件的内容按顺序合并,对于每行一个类名的services文件,正好可以保留所有条目;- 其余文件仍使用
replace默认策略,避免不必要的合并冲突。
执行mvn package后,生成的Jar包中META-INF/services/org.glassfish.jersey.internal.spi.AutoDiscoverable文件会同时包含以下两个条目:
a.b.client.sdk.common.client.AutoConfigService org.glassfish.jersey.jackson.internal.JacksonAutoDiscoverable
内容的提问来源于stack exchange,提问作者Srujan
相关产品推荐
相关产品推荐

