如何将指定包下类设为Maven变量自动生成ServiceLoader服务配置
你想要的原生Maven变量${project.handlers}没办法直接实现,因为Maven本身没有内置扫描指定包下实现类的能力,不过有两种成熟的方案可以彻底解决你每次手动维护服务配置文件的问题:
方案1:使用Google AutoService(推荐,操作最简单)
这是谷歌提供的注解处理器,编译时自动生成ServiceLoader需要的配置文件,完全不需要手动维护:
- 在pom.xml中引入AutoService依赖:
<dependencies> <dependency> <groupId>com.google.auto.service</groupId> <artifactId>auto-service</artifactId> <version>1.1.1</version> <scope>provided</scope> </dependency> </dependencies>
- 给每个
AbstractDeathHandler的实现类加上@AutoService注解:
import com.google.auto.service.AutoService; @AutoService(AbstractDeathHandler.class) public class EntityDeathExplosionHandler extends AbstractDeathHandler { // 原有逻辑不变 }
之后每次新增实现类,只需要加这个注解即可,编译时会自动生成完整的META-INF/services/com.jordanschnur.deathmessagesplus.handlers.AbstractDeathHandler文件,不需要你手动修改任何内容。
方案2:使用Maven插件扫描生成(无需修改代码)
如果你不想在代码里引入额外注解,可以用专门的ServiceLoader Maven插件在编译阶段扫描生成配置:
- 删除你现在手动维护的
resources/META-INF/services/下的对应文件,这个文件后续由插件自动生成 - 在pom.xml的
build/plugins节点中添加插件配置:
<plugin> <groupId>eu.somatik.serviceloader-maven-plugin</groupId> <artifactId>serviceloader-maven-plugin</artifactId> <version>1.3.0</version> <executions> <execution> <goals> <goal>generate</goal> </goals> </execution> </executions> <configuration> <services> <param>com.jordanschnur.deathmessagesplus.handlers.AbstractDeathHandler</param> </services> </configuration> </plugin>
插件会在编译阶段自动扫描你项目下所有继承了AbstractDeathHandler的实现类,自动生成对应的服务配置文件,新增实现类时不需要做任何额外操作。
内容的提问来源于stack exchange,提问作者Jordan Schnur
相关产品推荐
相关产品推荐

