Gradle:与 jar 依赖建立一场脂肪大战

Posted

技术标签:

【中文标题】Gradle:与 jar 依赖建立一场脂肪大战【英文标题】:Gradle: building a fat war with jar dependencies 【发布时间】:2019-07-16 22:23:29 【问题描述】:

我正在尝试从 Ant + Ivy 迁移到 Gradle,但无法正确包含传递依赖项。

例如,我有以下 Ivy 依赖项:

<dependency org="org.springframework" name="spring-jdbc" rev="4.2.0.RELEASE"/>

正如 Ivy 报告显示的那样,这个工件依赖于 spring-tx,它正在被 Ivy 检索并作为 jar 放置到 WEB-INF/lib。但是 Gradle 默认情况下不会这样做,并且这段代码也不能解决问题(它只是没有在其中放置任何与 spring-tx 相关的 .class 文件):

from  configurations.compileClasspath
            .findAll  !it.name.endsWith('pom') 
            .collect  it.isDirectory() ? it : zipTree(it)   
        into('WEB-INF/classes')
    

有谁知道我如何将传递依赖项包含为 jar 并将它们放入 WEB-INF\lib 中?

【问题讨论】:

你使用 Gradle war 插件吗? 是的,我确实使用这个插件 war 插件正是我认为您需要的。请参阅下面的答案:请尝试这个非常简单的项目设置并检查您是否得到预期的结果。 【参考方案1】:

Gradle war 插件可用于此目的(请参阅 War Plugin documentation)。

下面是一个非常简单的build.gradle 脚本示例,它将在/WEB-INF/lib 下创建一个包含所有需要的依赖项(和传递依赖项)的war

plugins
    id "war"


repositories 
    mavenCentral()


dependencies    
    implementation group: 'org.springframework', name: 'spring-jdbc', version: '4.2.0.RELEASE'


使用./gradlew build 生成的war 将在/WEB-INF/lib 文件夹。

【讨论】:

我确实使用了这个插件,它不会将任何传递依赖项放入WEB-INF/lib,只有声明的那些 您尝试过上面简单的 9 行脚本吗?我看不出你没有获取传递依赖的理由。顺便说一句,你使用的是哪个 Gradle 版本?

以上是关于Gradle:与 jar 依赖建立一场脂肪大战的主要内容,如果未能解决你的问题,请参考以下文章

gradle使用本地jar包

具有gradle的本地模块依赖性

gradle - 如何在 jar 中声明 jar 的依赖关系

gradle 在哪里保存依赖项的 jar?

使用 Gradle 创建带有依赖 Jar 的 Osgi Bundle

gradle导出依赖的jar包