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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 12:35:24