基于spring.profiles.active动态编译依赖项

时间:2018-05-30 10:07:33

标签: java gradle build.gradle

有人可以指导我从哪里开始这项任务吗?

在部署到jboss时,我只需要排除spring-boot-starter-tomcat

我想它看起来像是:

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web"){
        if(getProperty "spring.profiles.active" == "qat")
            exclude module: "spring-boot-starter-tomcat"
    }
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

通过上面的示例,我收到一个错误:

Could not get unknown property 'spring.profiles.active' for DefaultExternalModuleDependency{group='org.springframework.boot', name='spring-boot-starter-web', version='null', configuration='default'} of type org.gradle.api.internal.artifacts.dependencies.DefaultExternalModuleDependency.

也许我可以创建一个自定义任务来为任务设置spring.profiles.active。帮助!

1 个答案:

答案 0 :(得分:0)

正如Peter Ledbrook所说,gradle在编译时无法访问spring-boot的application.yml。 dependencies在gradle的生命周期中很早就开始运行,在dependencies解析之前永远不会调用任务。

即使尝试依赖项解析策略也是徒劳的。

所以我必须这样做:

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web") {
        if(System.getProperty("spring.profiles.active") == "qat"){
          exclude module: "spring-boot-starter-tomcat"
        }
    }
    compile("org.springframework.boot:spring-boot-starter-security")
    if(System.getProperty("spring.profiles.active") == "qat"){
        providedCompile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1'
    }
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

然后在部署到jboss时我会输入gradle build -Dspring-profiles-active=qat。当我必须在本地运行时,gradle bootRun -Dspring-profiles-active=dev