如何正确创建Gradle任务?

时间:2018-04-22 06:01:37

标签: java spring gradle

我正在尝试构建任务以允许我使用Gradle为我的spring应用程序指定我的个人资料。

buildscript {
    ext {
        springBootVersion = '2.0.1.RELEASE'
    }

    repositories {
        mavenCentral()
        jcenter()
    }
    dependencies {
        classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}"
    }
}

plugins {
    id "com.diffplug.gradle.spotless" version "3.10.0"
}

apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'maven'

spotless {
    java {
        googleJavaFormat()
        licenseHeaderFile 'habicus.license.java'
    }
}

group = 'com.remindful'
version = '1.0.0-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
    jcenter()
}

dependencies {
    compile('org.springframework.boot:spring-boot-starter-jersey')
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.springframework.boot:spring-boot-starter-web-services')
    compile('org.springframework.boot:spring-boot-starter-websocket')
    compile('org.springframework.session:spring-session-core')
    compile("com.h2database:h2")
    compile 'org.springframework.boot:spring-boot-starter-data-jpa'
    compile group: 'com.google.guava', name: 'guava', version: '11.0.2'
    testCompile 'junit:junit:4.12'
    testCompile group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '2.0.1.RELEASE'
}


// TODO: Add prod profile in application-properties
task prod {
    run { systemProperty "spring.profiles.active", "prod" }
}

task dev {
    run { systemProperty "spring.profiles.active", "dev" }
}
// To force debug on application boot, switch suspend to y
bootRun {
    systemProperties System.properties
    jvmArgs=["-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"]
}

tasks.bootRun.dependsOn build
bootRun.mustRunAfter dev

我有两个问题:

1)Intellij以黄色波浪线下划线突出显示任务,所以我想知道这里的语法是否错误?

2)我是否使用gradle-wrapper做这样的事情或只是gradle?我想要更好地理解差异。

1 个答案:

答案 0 :(得分:1)

  

1)Intellij以黄色波浪线下划线突出显示任务,所以我想知道这里的语法是否错误?

不幸的是,IntelliJ不完全支持gradle,例如,构建脚本中的ext块无法正确识别,因此当访问通过ext块定义的成员时,IntelliJ无法解析其定义&类型。

因此,当IntelliJ显示黄色下划线时,不需要恐慌,您只需要注意gradle命令报告的错误。如果gradle build说好,那么一切都很好。

同时,IntelliJ无法静态解析第三方插件,因此它也无法识别这些插件添加的任务和Task类。在这种情况下,它还会显示这个淡黄色下划线,抱怨类似cannot infer argument type

解决方法是refresh all Gradle projects,点击gradle面板上的刷新按钮,如果你的构建脚本写得正确,这些下划线很可能会消失。这是因为IntelliJ使用Gradle Tooling API嵌入gradle,并且在gradle同步过程中(由refresh all Gradle projects触发),第三方插件得到解析并构建了整个项目对象模型,因此IntelliJ会知道你的任务没有问题。

如果gradle build失败,则问题在于您自己的构建脚本。关于如何编写gradle构建脚本&正确完成任务,请参阅Authoring Tasks - Gradle User Manual

  

2)我是否使用gradle-wrapper做这样的事情或只是gradle?我想更好地理解其中的差异。

解释了Gradle包装器in the official userguide。简而言之,我会引用:

  

Wrapper是一个脚本,可以调用Gradle的声明版本,必要时可以预先下载。

因此,如果项目中没有包装器脚本,则应执行gradle wrapper生成一个,然后将其提交给VCS。之后,无论您以前在命令行中执行gradle <task>,都可以/应将其替换为./gradlew <task>(在* nix环境中)或gradlew.bat <task>(在Windows中)。

直接从命令行使用 gradle命令 gradle包装器脚本之间的主要区别在于, gradle包装器脚本<如果没有找到安装的gradle二进制文件,/ strong>将下载gradle二进制文件并使用它来执行gradle构建,而使用 gradle命令只会导致这种情况下的错误。

此外,当其他人正在使用您的项目时,他/她可以简单地克隆存储库并运行./gradlew build(在* nix中)或gradlew.bat build(在Windows中),您的项目将流畅地构建并且成功,无论他/她以前是否安装过gradle分发。