0

我有一种情况,我所需的依赖项 jar 中还嵌入了旧版本的依赖项(uber-jar 样式)。

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

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

此策略基于有关该主题的这篇博客文章,但在我的情况下,我没有确保classes文件夹首先出现在类路径中,而是首先推送不兼容的嵌入式类的兼容版本。

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

该博客文章还使用 gradlecopySpec将自定义启动器类从${buildDir}/classesspring-boot jar 的根目录中复制,以便负责加载Main-Class清单中作为 a 调用的类的类加载器可以访问它。

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

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

无论哪种方式,我只熟悉 gradle 基础知识,不知道如何通过 gradle 技术完成这些选项中的任何一个。

任何指导表示赞赏!

4

1 回答 1

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,所以请随时发布更多惯用的解决方案;)

于 2018-05-29T12:04:46.107 回答