【问题标题】:how to use a custom subclass of the spring-boot JarLauncher?如何使用 spring-boot JarLauncher 的自定义子类?
【发布时间】:2018-11-05 20:58:32
【问题描述】:

我有一种情况,我所需的依赖项 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 技术完成其中任何一个选项。

感谢任何指导!

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      • 2016-07-09
      • 1970-01-01
      • 2019-05-25
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      相关资源
      最近更新 更多