Gradle:如何从耳朵文件中排除jar?

时间:2017-07-28 09:21:30

标签: gradle jar dependencies war ear

我有一个关于从耳神器中排除jar文件的问题。我的项目有以下模块:

project
 - ejb_module
 - war_module
 - ear_module
 - other_module

在我的ear_module/build.gradle

dependencies {
    deploy project(ejb_module)
    earlib project(ejb_module)

    deploy project(war_module)
    earlib project(war_module)
}

问题是我如何排除war_module产生的jar工件。

war_module同时产生war和jar工件。我需要jar工件的原因是我的other_module依赖于它。

一个复杂的因素是war_module有一些依赖需要经过earlib

所以我的问题是我如何从ear文件中排除war_module.jar?它包含在root和APP-INF/lib中。

2 个答案:

答案 0 :(得分:0)

我假设您war_module正在应用warjava个插件来获取.war..jar个工件?

尝试:

deploy project(path: 'war_module', configuration: 'archives')
earlib project(path: 'war_module', configuration: 'archives')

它应该只选择一个.war,因为如果查看Gradle war插件代码,你可以看到它覆盖了项目的默认输出,如果包含了java插件。

此外,war插件使用java插件来编译你的代码。

当然,您可以使用

简单地从构建中排除人工制品
config (project){exclude module: 'name'}

但我认为这不是你能做的最好的事情。

尝试查看providedRuntimeruntimeOnly配置,具体取决于您使用的Gradle版本。

如果人工制品用于编译,则compileOnly

dependecies{}中使用的此配置将使用jar但不会在其他任何地方暴露它,那么它不应该落在你构建的任何人工制品中,这可能是你最适合你的情况,但问题并不是在问这个问题,而只是一个建议。

答案 1 :(得分:0)

假设xxx.yyy.zzz.jar说,假设您的EAR包含另一个现有的jar。

在您的耳朵项目的build.gradle中,添加以下内容

ext.replacement = 'your.group:xxx.yyy.zzz:your.version'

configurations.all {
    resolutionStrategy {
        eachDependency { DependencyResolveDetails details ->
            // remove to.be.excluded.jar
            if (details.requested.group == 'your.group' &&
                details.requested.name == 'to.be.excluded' && 
                details.requested.version == 'your.version') {
                details.useTarget replacement
            }
        }
    }
}

这样,to.be.excluded.jar将被xxx.yyy.zzz.jar取代,实际上会将其从EAR中移除。