1

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

我还在使用各种 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 是该问题的唯一解决方案吗?
4

0 回答 0