如何使用spring-boot JarLauncher的自定义子类?

时间:2018-05-26 19:51:10

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

我遇到一种情况,其中一个我需要的依赖项jar也嵌入了旧版本的依赖项(uber-jar风格)。

遗憾的是,嵌入式依赖项与其他一些依赖项不兼容。

我找到了一个使用com.springframework.boot.loader.JarLauncher自定义版本的策略,我可以通过覆盖postProcessClassPathArchives方法来操作类路径中jar文件的顺序。

此策略基于this blog post on the topic,但在我的情况下,我没有确保classes文件夹首先出现在类路径中,而是首先推送不兼容的嵌入式类的兼容版本。

引用的博客文章将JarLauncher的子类放在项目本身,但在我的情况下,这种情况会发生在多个项目中,所以我想将JarLauncher的自定义子类分解为它是自己的项目,并通过一些适当的maven存储库将其作为一个独特的依赖项提供。

博客文章还使用gradle copySpec将自定义启动器类从${buildDir}/classes复制到spring-boot jar的根目录中,以便负责加载类的类加载器可以访问它在清单中称为Main-Class

所以,我的问题是围绕实现类似结果的选项,但使用嵌入在依赖jar中的自定义启动器。

我想知道我是否可以从放置在boot-jar根目录下的jar文件中引用自定义启动器,或者如果我需要提取内容并在那里移动离散类。

无论哪种方式,我只熟悉gradle基础知识,并且不确定如何通过gradle技术完成其中任何一个选项。

任何指导赞赏!

1 个答案:

答案 0 :(得分:0)

经过一些研究和修补后,我提出了以下解决方案:

configurations {
  bootHelpr { transitive = false }
}

dependencies {
  //...
  bootHelpr 'com.github.the-watchmen:boot-helpr:1.0.0'
}

bootJar {
  with copySpec {
    from(zipTree(configurations.bootHelpr.singleFile))
  }
}

其中boot-helpr是包含自定义JarLauncher ...

的依赖项

我认为自己是一个gradle hack,所以随意发布任何更惯用的解决方案;)