Spring Boot (Reactive) - bootJar 与服务提供者接口 (SPI)

时间:2021-04-29 05:10:37

标签: java spring-boot gradle spring-boot-gradle-plugin twelvemonkeys

我使用带有 Netty 和 Gradle 的 Reactive Spring Boot 作为构建系统。为了构建生产的可执行文件,我使用带有 launchScript() 的任务 bootJar。

我还使用各种 TwelveMonkeys 的插件进行 ImageIO 处理。当我从 IntelliJ 运行应用程序时一切正常,但是当我使用 bootJar 构建它时 - 这些插件不起作用 - 就像它们没有安装一样。

我打开了Spring制作的jar,所有插件jar都在里面。

在 TwelveMonkeys 的手册上,他们说:

<块引用>

推荐的使用插件的方法是通过 Maven 依赖项或类似的方式将 JAR 按原样包含在您的项目中。使用库不需要重新打包,不推荐使用。

但是,如果您想创建一个“胖”的 JAR,或者想以其他方式 出于某种原因重新打包 JAR,重要的是要记住 ImageIO 自动发现插件依赖于服务 提供者接口 (SPI) 机制。简而言之,每个 JAR 包含一个 特殊文件夹,名为 META-INF/services 包含一个或多个文件, 通常 javax.imageio.spi.ImageReaderSpi 和 javax.imageio.spi.ImageWriterSpi。这些文件同名存在 在每个 JAR 中,所以如果您只是将所有内容解压缩到一个文件夹中,或者 创建一个 JAR,文件将被覆盖并且行为未指定 (很可能你最终会安装一个插件)。

所以这里有几个问题:

  1. bootJar 任务是创建了一个 fatJar 还是其他什么?
  2. bootJar 创建的 jar 是否能够使用 SPI 发现插件,如上述评论中所述?
  3. 如果它能够做到这一点 - 为什么它不起作用以及可以从哪些地方开始调查? (也许是这个配置问题?)
  4. 如果它没有能力 - shadowJar 是解决该问题的唯一方法吗?

0 个答案:

没有答案