使用 bootJar 行为覆盖项目的 jar 任务

Posted

技术标签:

【中文标题】使用 bootJar 行为覆盖项目的 jar 任务【英文标题】:Override jar task for project with bootJar behavior 【发布时间】:2021-09-24 20:05:04 【问题描述】:

我刚刚将 Gradle SpringBoot 插件版本升级到 2.5.2 并发现了 jarbootJar 任务之间的区别 - 前者构建了一个后缀为 -plain.jar 的工件,而后者构建了一个实际的可执行工件.我还有一个自定义插件,它使用jar 任务的输出,如下所示:

    @Override
    void apply(Project project) 
         project.copy 
                     from project.jar
                     into someDir
         
    

鉴于project.jar 是一个实际上不可执行的-plain.jar,有没有办法修改jar 任务的行为,这样我就不必修改插件了?要复制的工件必须是可执行应用程序。

【问题讨论】:

【参考方案1】:

看起来您的插件依赖于 jarbootJar 任务创建同名的 jar 文件。这并不理想。例如,在上面显示的代码中,不能保证bootJar 在复制之前已经构建了可执行的 jar 文件。如果可能的话,我建议更新插件以从bootJar 复制而不是jar

如果您无法更改插件,您应该能够通过禁用 jar 任务并删除其分类器来恢复旧行为:

jar 
    enabled = false
    classifier = ''

这将导致jar 任务与bootJar 任务具有相同的输出位置并禁用它,以便一个任务的输出不会被另一个任务覆盖。

【讨论】:

谢谢!这成功了,更新插件现在也在我们的 TODO 上。 另外,为什么只添加 enabled = false 不起作用?为什么我们还需要设置分类器? 分类器是输出文件名的一部分。如果您不将其设置为空字符串,则您的副本将查找名为 …-plain.jar 的文件。

以上是关于使用 bootJar 行为覆盖项目的 jar 任务的主要内容,如果未能解决你的问题,请参考以下文章

使用 gradle bootJar 而不是 jar 任务并在 Jenkins 中构建失败

Gradle kotlin Springboot多模块导致无法引用kotlin的类文件(BootJar)

Gradle kotlin Springboot多模块导致无法引用kotlin的类文件(BootJar)

如何使用 Spring Boot“bootJar”插件创建 gradle 任务以生成爆炸性战争?

如何让 Teamcity Artifactory 插件在 Gradle 中调用 bootJar 而不是 Jar?

BootJar + MavenJar。工件不是由这个构建产生的