【问题标题】:Create multiple .WAR files with different dependencies in Gradle在 Gradle 中创建多个具有不同依赖项的 .WAR 文件
【发布时间】:2012-10-25 21:37:23
【问题描述】:

我正在使用 war 插件为我的 gradle 项目生成一个简单的 .WAR 文件。我想知道如何配置 gradle,以便我可以创建 4 个具有不同依赖项的不同 .WAR 文件。

我已经使用进入发行版所需的 jar 配置了依赖项编译配置。 src 中的代码都不依赖于其中的几个 jar,但我想知道如何配置项目以创建

  • 包含依赖图中所有 jar 的 standard.WAR 文件(即使它们没有被使用 - 没关系 - 我正在测试一些东西)
  • 另一个仅包含 qas.jar 的 standard-qas-only.WAR 文件
  • 另一个包含 qas.jar 和 log4j 的 standard-qas-log4j.WAR 文件

我要配置哪些任务以使生成的工件使用特定的依赖配置?

仅供参考:在这种情况下,编译所需的唯一 jar 是 qas.jar。

我下面的示例创建了一个仅包含一个 jar 的 war 文件,但我希望使用不同的 jar 生成 5 个不同的 .war 文件。

build.gradle

apply plugin: 'java'
apply plugin: 'war'

dependencies {
    compile files('/lib/qas.jar','/lib/axis1-1.4.jar','/lib/axis2-kernel-1.3.jar','/lib/dom4j-1.6.1.jar','/lib/log4j-1.2.14.jar')
    providedCompile files('/lib/j2ee-1.4.03.jar')
}

war {
    classpath = ['/lib/qas.jar']
}

task dist(dependsOn: 'war') << {
    copy {
        from war.archivePath
        into "dist/"
    }
}

【问题讨论】:

    标签: groovy gradle dependency-management


    【解决方案1】:

    我对您实际尝试构建多少个 WAR 发行版感到有些困惑。您可以轻松地对其进行修改以创建其他 WAR 文件。这是实现这一目标的一种方法:

    task createStandardWar(type: War, dependsOn: classes) {
        baseName = 'standard'
        destinationDir = file("$buildDir/dist")
    }
    
    task createStandardWarQasOnly(type: War, dependsOn: classes) {
        baseName = 'standard-qas-only'
        destinationDir = file("$buildDir/dist")
        classpath = war.classpath.minus(files('/lib/axis1-1.4.jar','/lib/axis2-kernel-1.3.jar','/lib/dom4j-1.6.1.jar','/lib/log4j-1.2.14.jar'))
    }
    
    task createStandardWarQasAndLog4J(type: War, dependsOn: classes) {
        baseName = 'standard-qas-log4j'
        destinationDir = file("$buildDir/dist")
        classpath = war.classpath.minus(files('/lib/axis1-1.4.jar','/lib/axis2-kernel-1.3.jar','/lib/dom4j-1.6.1.jar'))
    }
    
    task createDists(dependsOn: [createStandardWar, createStandardWarQasOnly, createStandardWarQasAndLog4J])
    

    此构建脚本摘录通过声明 War 类型的增强任务来创建三个不同的 WAR 文件。它假定您仍然希望在 WAR 文件中的 WEB-INF/classes 下拥有已编译的源文件,因此我没有将其从类路径中删除。分发最终在目录build/dist 中。任务createDists 会创建所有这些。

    【讨论】:

    • 有道理。把它带到下一步。如果我想根据 gradle.property 控制运行哪个任务,我该怎么做?
    • 您可以使用 onlyIf 方法,例如onlyIf { project.hasProperty('warDist') }。当然你可以在闭包中实现任何你需要的自定义逻辑。
    • 谢谢本杰明,但这似乎对我不起作用,我收到以下错误:org.gradle.api.tasks.bundling.War_Decorated cannot be cast to java.lang.Class。自从您编写此答案后,您是否认为这与 Gradle 的更高版本不兼容?
    • 哦,误报...没有注意到在这种情况下War 必须大写。令人困惑!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 2020-08-19
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多