在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
SlotSpring Boot 可插件化拓展改造器,让 Spring-Boot 应用支持加载外部 jar 包,实现插件化拓展。 GitHub: https://github.com/core-lib/slot-maven-plugin Slot: 在计算机行业指的就是周边元件扩展插槽。问题描述Spring-Boot 项目打包后是一个FatJar 即把所有依赖的第三方jar也打包进自身的jar中,运行时 classpath 包括 FatJar 中的 BOOT-INF/classes 目录和 BOOT-INF/lib 目录下的所有jar。 那么问题是要想加载外部化 jar 就只能打包期间把 jar 依赖进去,无法实现可插拔式插件化拓展。 Slot 就是一个可以将 Spring-Boot 项目升级为可支持加载外部 jar 的 Maven 插件。 原理说明一个 Spring-Boot JAR 启动的流程可以分为以下几步:
Slot 的核心原理是:
环境依赖
使用说明<project> <!-- 设置 jitpack.io 插件仓库 --> <pluginRepositories> <pluginRepository> <id>jitpack.io</id> <url>https://jitpack.io</url> </pluginRepository> </pluginRepositories> <!-- 添加 Slot Maven 插件 --> <build> <plugins> <plugin> <groupId>com.github.core-lib</groupId> <artifactId>slot-maven-plugin</artifactId> <version>1.0.2</version> <executions> <execution> <goals> <goal>transform</goal> </goals> <phase>package</phase> <configuration> <!-- optional <sourceDir/> <sourceJar/> <targetDir/> <targetJar/> --> </configuration> </execution> </executions> </plugin> </plugins> </build></project> 参数说明
插件的默认执行阶段是 package , 当然也可以通过使用以下命令来单独执行。 mvn slot:transformmvn slot:transform -Dslot.targetJar=your-spring-boot-app-slot.jar 默认情况下,通过 slot 升级后的 jar 名称为 ${project.build.finalName}-slot.jar ,可以通过插件配置或命令参数修改。 注意事项<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <!-- 需要将executable和embeddedLaunchScript参数删除,目前还不能支持对该模式Jar的升级! <configuration> <executable>true</executable> <embeddedLaunchScript>...</embeddedLaunchScript> </configuration> --></plugin> 启动应用Slot 支持使用两个参数来指定要加载的外部 jar 包:
java -jar spring-boot-app-slot.jar --slot.root=/absolute/root/ --slot.path=foo.jar --slot.path=bar.jarjava -jar spring-boot-app-slot.jar --slot.path=/relative/path/to/plugin.jarjava -jar spring-boot-app-slot.jar --slot.path=/relative/path/to/**.jar ANT 表达式通配符说明
通配符可以随意组合使用! 例如 /plugins/**/plugin-*-v???.jar 使用技巧由于通过 Slot 加载后的外部 jar 实际上和 Spring-Boot JAR 中的 jar 处于同一个 ClassLoader 所以外部插件和母体应用之间是一个平级的关系,外部插件可以引用母体应用中的 class 同样母体应用也可以引用外部插件的 class。 由于外部插件项目或模块通常也会依赖另外的第三方jar,所以外部插件与母体应用集成运行时也需要把另外的第三方jar通过--slot.path参数加载进来。推荐使用 maven-dependency-plugin 在打包时将需要用到的第三方jar拷贝到指定目录,最后通过ANT表达式方式一起加载运行。 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <includeScope>runtime</includeScope> <outputDirectory>${project.build.directory}/dependencies</outputDirectory> </configuration> </execution> </executions></plugin> 或者使用 maven-shade-plugin 插件把相关的第三方jar资源通通打包进一个。 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.1.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> ... </configuration> </execution> </executions></plugin> 另外需要注意的是,当母体应用和外部插件有相同的第三方依赖时,推荐让外部插件模块以 <scope>provided</scope> 的方式依赖之。 下面是作者想到的一些插件化拓展的方案:
版本记录
协议声明联系作者QQ 646742615 不会钓鱼的兔子 |
请发表评论