从 springBoots `bootJar` gradle 任务中排除特定依赖项

Posted

技术标签:

【中文标题】从 springBoots `bootJar` gradle 任务中排除特定依赖项【英文标题】:Exclude a specific dependency from springBoots `bootJar` gradle task 【发布时间】:2018-12-05 12:21:32 【问题描述】:

我需要从 springBoots bootJar gradle 任务中排除特定的依赖项(类似于 maven 中提供的范围)。

我尝试了自定义配置,但 dependency-which-should-not-be-in-bootJar 仍包含在生成的 jar 中。

configurations
    provided
    implementation.extendsFrom provided


dependencies 
    // ...
    provided "dependency-which-should-not-be-in-bootJar"


jar 
    from configurations.compile - configurations.provided
    from configurations.runtime


bootJar 
    from configurations.compile - configurations.provided
    from configurations.runtime
    launchScript()

【问题讨论】:

bootJar 默认包含运行时类路径。它继承自 implementation,您已将其配置为从 provided 扩展。因此,运行时类路径包含您提供的依赖项,因此它包含在 fat jar 中。 我还尝试将我的provided 更改为providedRuntime 并让它从runtime 扩展,之后我尝试配置bootJar 以使用from configurations.runtime - configurations.providedRuntime 覆盖运行时包含,我认为应该这样做工作,但它没有。您能否指出正确的方向,如何正确排除依赖项与 jar 一起打包。 【参考方案1】:

您实际上可以使用 compileOnly 作为您对 gradle > 2.12 的依赖项

dependencies 
     // ...
     compileOnly "dependency-which-should-not-be-in-bootJar"

您仍然可以将它用于测试 + 运行时,但不会在最终构建的 jar 中。

【讨论】:

在我的情况下,我还必须添加testRuntime,否则它工作得很好,谢谢。【参考方案2】:

我还在 spring boot gitter 频道中从 Andy Wilkinson 那里得到了答案,它的工作方式略有不同,但设法实现了相似。

configurations 
    custom
    runtime.extendsFrom custom


dependencies 
    compile 'org.springframework.boot:spring-boot-starter-web'
    custom 'com.h2database:h2'


bootJar 
    exclude 
        configurations.custom.resolvedConfiguration.files.contains(it.file)
    

谢谢你,安迪 =)

【讨论】:

它不适用于类路径文件夹:resolvedConfiguration.files 仍然包含文件夹 java.io.File 本身,而 it.file 是该文件夹的子文件夹 这对我有用:configurations.custom.resolvedConfiguration.files.find customEntry -> it.file.toPath().startsWith(customEntry.toPath()) != null

以上是关于从 springBoots `bootJar` gradle 任务中排除特定依赖项的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

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

找不到参数的方法 bootJar()