Java 注射及;配置Gradle构建

Java 注射及;配置Gradle构建,java,groovy,build,gradle,Java,Groovy,Build,Gradle,我正在阅读Gradle,对它非常感兴趣,特别是因为(看起来)它允许在构建过程中引入继承。例如,如果我有一个Java web应用程序,可以打包并部署到Google app Engine实例和Amazon EC2实例,那么我需要一个复杂的构建,可以采用相同的Java、XML、属性、CSS和图像文件,并将它们打包/部署到两个完全不同的打包WAR文件中 GAE应用程序的打包方式非常具体;EC2(基本上)只要求您遵守servlet规范。GAE应用程序通过运行SDK附带的appcfg.sh脚本中的updat

我正在阅读Gradle,对它非常感兴趣,特别是因为(看起来)它允许在构建过程中引入继承。例如,如果我有一个Java web应用程序,可以打包并部署到Google app Engine实例和Amazon EC2实例,那么我需要一个复杂的构建,可以采用相同的Java、XML、属性、CSS和图像文件,并将它们打包/部署到两个完全不同的打包
WAR
文件中

GAE应用程序的打包方式非常具体;EC2(基本上)只要求您遵守servlet规范。GAE应用程序通过运行SDK附带的
appcfg.sh
脚本中的
update
命令来“部署”;EC2有自己的应用部署方式。关键是,这两个PaaS提供商的打包/部署过程非常不同:

public abstract class PackageTask {
    // ...
}

// Package my Eclipse project for deployment to GAE.
public class AppEnginePackageTask extends PackageTask {
    // ...
}

// Package my Eclipse project for deployment to EC2 instances.
public class AmazonPackageTask extends PackageTask {
    // ...
}

public abstract class DeployTask {
    // ...
}

// Deployment to GAE.
public class AppEngineDeployTask extends DeployTask {
    // ...
}

// Deployment to EC2.
public class AmazonDeployTask extends DeployTask {
    // ...
}
然后,我可能有一个
myapp.gradle
buildfile,用于模板化任务的构建顺序:

clean()
compile()
package()
deploy()
…不知何故,我可以为基于GAE的构建配置/注入
AppEnginePackageTask
/
AppEngineDeployTask
以代替
package()
/
deploy()
,或者我可以将
AmazonPackageTask
/配置/注入到那些模板化的任务中。再说一次,我不知道该怎么做(或者即使格拉德尔能做到),但这正是我想要的

我的理解是Gradle可以做到这一点。Ant也可能被迫使用高度模块化、优雅的构建,但由于基于XML,它需要一些技巧,而像Groovy这样基于OOP的语言使其更干净、更简单

但是,我看到的所有Gradle任务示例都采用以下形式:

task package(dependsOn: 'compile') {
    // ...
}

task deploy(dependsOn: 'package') {
    // ...
}
所以我问:这些看起来/感觉像是非OOP任务定义。我对Gradle(及其OOP本质)的理解根本上是错误的吗?我错过了什么?我如何才能实现这些“可配置/可注入构建模板”和基于继承的任务的概念?提前谢谢

Edit我用“
groovy
”重新标记了这个问题,因为Gradle构建脚本是用groovy DSL编写的,而碰巧是groovy大师的人(比如说速度是groovy大师的5倍)也可以插话,即使他们对Gradle知之甚少。

因为有简单任务和增强任务。后者更加灵活和强大

下面的示例与您描述的不完全一样,re:injection,但它演示了OOP

下面是build.gradle文件示例。它避免了“package”,因为这是Java/Groovy中的一个关键字。“build”目标依赖于“compile”和“doPack”的某种风格,这取决于名为“pkgTarget”的属性

task compile << { 
    println "compiling..." 
}

task build() << {
}

build.dependsOn { 
    compile
}

build.dependsOn { 

    if (pkgTarget == "Amazon") {
        task doPack(type: AmazonPackageTask)
    } else if (pkgTarget == "Google") {
        task doPack(type: GooglePackageTask)
    } else {
        task doPack(type: MyPackageTask) 
    }
}
这是gradle.properties文件:

pkgTarget=Amazon
pkgTarget=Amazon