为什么在构建过程中执行我的gradle任务会被跳过?

时间:2018-10-23 14:07:15

标签: gradle build.gradle

我目前正在将应用程序从Maven迁移到Gradle(4.10.2)。 在maven中,将生成一个tar.gz文件,其中包含配置,依赖项和一些空目录,应用程序随后将在运行时使用这些空目录。

在gradle中,我正在使用发行插件通过distTar-Task创建tar.gz。

要在tar.gz中创建空目录,请在构建目录中创建它们,然后由distTar将它们复制到tar.gz中。

我最终通过创建一个任务createEmptyDirectories来解决这个问题,该任务将只创建目录并完成该工作。 distTar将依赖于此任务,以便在我认为tar.gz之前创建目录。

在构建过程中(使用createEmptyDirectories总是跳过任务gradle clean build

:createEmptyDirectories (Thread[Daemon worker Thread 7,5,main]) started.

> Task :createEmptyDirectories 
Skipping task ':createEmptyDirectories' as it has no actions.

:createEmptyDirectories (Thread[Daemon worker Thread 7,5,main]) completed. Took 0.0 secs.

当我使用gradle createEmptyDirectories自己运行任务时,任务将正确执行:

> Configure project : 
build/mailmanager/var/rtc/command_control created[true]
build/mailmanager/var/rtc/resources created[true]
build/mailmanager/var/log created[true]

我在做什么错?有没有更好的方法将这些空目录放入tar中?

这是我的build.gradle:

    buildscript {
    dependencies {
        classpath 'org.asciidoctor:asciidoctor-gradle-plugin:1.5.8'
        classpath 'org.asciidoctor:asciidoctorj-pdf:1.5.0-alpha.15'
    }
}

plugins {
    id 'org.asciidoctor.convert' version '1.5.3'
    id 'java'
    id 'distribution'
}


group = 'de.printcom'
version = '4.4.0'
description = 'MailManager'

sourceCompatibility = 1.8
targetCompatibility = 1.8

//mainClassName = 'de.printcom.mailmanager.StartManagerWithoutUi'

tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}


task('createEmptyDirectories') {
    dependsOn jar

    boolean created =  new File(project.buildDir.name + "/mailmanager/var/rtc/command_control").mkdirs()
    System.println(project.buildDir.name + "/mailmanager/var/rtc/command_control created[" + created + "]")

    created = new File(project.buildDir.name + "/mailmanager/var/rtc/resources").mkdirs()
    System.println(project.buildDir.name + "/mailmanager/var/rtc/resources created[" + created + "]")

    created = new File(project.buildDir.name + "/mailmanager/var/log").mkdirs()
    System.println(project.buildDir.name + "/mailmanager/var/log created[" + created + "]")
}

distTar {
    dependsOn check, createEmptyDirectories
    compression = Compression.GZIP
    extension = 'tar.gz'
}

distributions {
    main {
        contents {
            into("mailmanager/lib") {
                from jar
                from configurations.runtime
                fileMode = 744
            }

            from("src/main/scripts/release_preprocessing/Release_4_3_0/Preprocessing") {
                into("mailmanager/sql")
                fileMode = 750
            }
            from("src/main/scripts/release_preprocessing/Release_4_3_0/Rollback") {
                into("mailmanager/sql")
            }
            from("src/main/scripts/") {
                include("startup.sh")
                into("mailmanager/bin")
            }
            from("src/main/scripts/commands") {
                include("*.mmc")
                into("mailmanager/commands")
                fileMode = 640
            }
            from("src/main/scripts/configuration") {
                include("*.mmc")
                into("mailmanager/commands")
                fileMode = 640
            }
            from("src/main/resources/properties/deploy") {
                include("default.properties", "live.properties", "test.properties", "wallet_example.properties")
                into("mailmanager/conf")
                rename("default.properties", "default.properties.template")
                rename("live.properties", "live.properties.template")
                rename("test.properties", "test.properties.template")
                rename("wallet_example.properties", "wallet_example.properties.template")
                fileMode = 640
            }
            from("src/main/resources") {
                include("quartz.properties", "ehcache.xml")
                into("mailmanager/conf")
                fileMode = 640
            }
            from(project.buildDir.name + "/classes") {
                include("log4j-updated.xml")
                into("mailmanager/conf")
                rename("log4j-updated.xml", "log4j.xml")
                fileMode = 644
            }
            from(project.buildDir.name + "/resources/main/version.html") {
                include("version.html")
                into("mailmanager")
                fileMode = 644
            }
            from("README.txt") {
                into("mailmanager")
                fileMode = 644
            }
            from("KnownBugs.txt") {
                into("mailmanager")
                fileMode = 644
            }
            from("ReleaseNotes.txt") {
                into("mailmanager")
                fileMode = 644
            }
            into("mailmanager/docs") {
                from asciidoctor
                include("Handbuch.pdf")
                fileMode = 644
            }
            into ("var") {
                from createEmptyDirectories
                include("rtc/command_control")
                include("rtc/resources")
                include("log")
                fileMode = 644
                includeEmptyDirs=true
            }
//            from(project.buildDir.name + "/mailmanager/var") {
//                include("rtc/command_control")
//                include("rtc/resources")
//                include("log")
//                into("var")
//                fileMode = 644
//                includeEmptyDirs=true
//            }
        }
    }
}

asciidoctorj {
    version = '1.5.5'
}

asciidoctor {
    backends 'pdf'
    attributes 'build-gradle': file('build.gradle'),
            'sourcedir': 'src/docs/asciidoc',
            'source-highlighter': 'coderay',
            'imagesdir': 'images',
            'toc': 'left',
            'icons': 'font',
            'setanchors': '',
            'idprefix': '',
            'idseparator': '-',
            'docinfo1': '',
            'revnumber': project.version,
            'revdate': getDate()
}

def getDate() {
    new Date().format('d.MM.yyyy')
}

test {
    testLogging {
        events "started", "passed", "skipped", "failed", "standardOut", "standardError"
    }
}

dependencies {
    compile group: 'commons-lang', name: 'commons-lang', version: '2.6'
    compile group: 'commons-io', name: 'commons-io', version: '2.4'
    compile group: 'commons-codec', name: 'commons-codec', version: '1.10'
    compile group: 'org.apache.ant', name: 'ant', version: '1.9.6'
    compile group: 'org.antlr', name: 'antlr', version: '3.5.2'
    compile group: 'javax.el', name: 'javax.el-api', version: '2.2.4'
    compile group: 'org.glassfish.web', name: 'javax.el', version: '2.2.4'
    compile group: 'org.apache.commons', name: 'commons-email', version: '1.5'
    compile group: 'org.apache.commons', name: 'commons-compress', version: '1.17'
    compile group: 'org.projectlombok', name: 'lombok', version: '1.18.2'
    compile group: 'com.google.guava', name: 'guava', version: '18.0'
    compile group: 'javax.annotation', name: 'jsr250-api', version: '1.0'
    compile group: 'org.eclipse.persistence', name: 'javax.persistence', version: '2.1.0'
    compile group: 'org.springframework', name: 'spring-core', version: '4.1.7.RELEASE'
    compile group: 'org.springframework', name: 'spring-beans', version: '4.1.7.RELEASE'
    compile group: 'org.springframework', name: 'spring-orm', version: '4.1.7.RELEASE'
    compile group: 'org.springframework', name: 'spring-jdbc', version: '4.1.7.RELEASE'
    compile group: 'org.springframework', name: 'spring-tx', version: '4.1.7.RELEASE'
    compile(group: 'org.springframework', name: 'spring-context', version: '4.1.7.RELEASE') {
        exclude(module: 'commons-logging')
    }
    compile group: 'org.springframework', name: 'spring-context-support', version: '4.1.7.RELEASE'
    compile group: 'org.hibernate', name: 'hibernate-core', version: '4.3.10.Final'
    compile group: 'org.hibernate', name: 'hibernate-entitymanager', version: '4.3.10.Final'
    compile group: 'org.hibernate', name: 'hibernate-c3p0', version: '4.3.10.Final'
    compile group: 'org.hibernate', name: 'hibernate-ehcache', version: '4.3.10.Final'
    compile group: 'org.hibernate.common', name: 'hibernate-commons-annotations', version: '4.0.5.Final'
    compile group: 'org.hibernate.javax.persistence', name: 'hibernate-jpa-2.1-api', version: '1.0.0.Final'
    compile group: 'org.hibernate', name: 'hibernate-validator', version: '4.3.2.Final'
    compile group: 'javax.validation', name: 'validation-api', version: '1.1.0.Final'
    compile group: 'net.sf.ehcache', name: 'ehcache-core', version: '2.6.11'
    compile group: 'com.mchange', name: 'c3p0', version: '0.9.5.1'
    compile group: 'com.sun.mail', name: 'javax.mail', version: '1.6.0'
    compile group: 'dom4j', name: 'dom4j', version: '1.6.1'
    compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.12'
    compile group: 'commons-logging', name: 'commons-logging', version: '1.2'
    compile(group: 'org.quartz-scheduler', name: 'quartz', version: '2.2.1') {
        exclude(module: 'c3p0')
    }
    compile group: 'org.quartz-scheduler', name: 'quartz-jobs', version: '2.2.1'
    compile group: 'com.cronutils', name: 'cron-utils', version: '5.0.5'
    compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.36'
    compile group: 'hsqldb', name: 'hsqldb', version: '1.8.0.10'
    compile group: 'com.oracle', name: 'ojdbc7', version: '12.1.0.2'
    compile group: 'com.oracle', name: 'oraclepki', version: '12.1.0.2'
    compile group: 'com.oracle', name: 'osdt_cert', version: '12.1.0.2'
    compile group: 'com.oracle', name: 'osdt_core', version: '12.1.0.2'
    compile group: 'org.slf4j', name: 'slf4j-log4j12', version: '1.7.12'
    compile group: 'log4j', name: 'log4j', version: '1.2.17'
    testCompile group: 'com.h2database', name: 'h2', version: '1.4.193'
    testCompile group: 'org.junit.vintage', name: 'junit-vintage-engine', version: '4.12.2'
    testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.0.0'
    testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-params', version: '5.0.0'
    testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.0.0'
    testCompile group: 'org.junit.platform', name: 'junit-platform-launcher', version: '1.0.2'
    testCompile group: 'org.mockito', name: 'mockito-core', version: '2.19.1'
    testCompile group: 'com.github.stefanbirkner', name: 'system-rules', version: '1.16.0'
    testCompile group: 'net.jodah', name: 'concurrentunit', version: '0.4.2'
    testCompile group: 'org.springframework', name: 'spring-test', version: '4.1.7.RELEASE'
    testCompile group: 'org.assertj', name: 'assertj-core', version: '3.2.0'
    testCompile(group: 'org.dbunit', name: 'dbunit', version: '2.5.1') {
        exclude(module: 'junit')
    }
    testCompile group: 'com.github.springtestdbunit', name: 'spring-test-dbunit', version: '1.2.1'
    testCompile group: 'pl.pragmatists', name: 'JUnitParams', version: '1.0.5'
    testCompile group: 'com.tngtech.archunit', name: 'archunit', version: '0.8.0'
}

1 个答案:

答案 0 :(得分:1)

第一件事:您应该在doLast { ... }闭包中包装要执行任务的自定义内容。

task createDirectories {
  doLast {
    // do stuff
  }
}

第二,要创建目录,您应该使用mkdir方法:https://docs.gradle.org/current/userguide/working_with_files.html#sec:creating_directories_example,该方法将默认在主项目目录下创建目录。

所以您的任务应该变成:

task createEmptyDirectories {
    dependsOn jar
    doLast {
      mkdir "mailmanager/var/rtc/command_control"
      mkdir "mailmanager/var/rtc/resources"
      mkdir "mailmanager/var/log"
    }
}

这是一个可以满足您的需要的工作示例:

目录结构(非常基础)

gradle-test
  src/main/java/Main.java
  build.gradle
  settings.gradle

Main.java

public class Main {
  public static void main(String[] args) {
    System.out.println("Hello world");
  }
}

settings.gradle

rootProject.name = 'gradle-test'

build.gradle

apply plugin: 'java'
apply plugin: 'distribution'

task createEmptyDirectories {
    doLast {
        mkdir 'var/test'
    }
}

distTar.dependsOn createEmptyDirectories

distributions {
    main {
        contents {
            into('lib') {
                from jar
            }
            into('var') {
                from 'var'
            }
        }
    }
}

运行gradle distTar后,将产生build/distributions/gradle-test.tar

gradle-test> tar tvf build/distributions/gradle-test.tar

drwxr-xr-x  0 0      0           0  1 Nov 00:51 gradle-test/
drwxr-xr-x  0 0      0           0  1 Nov 00:51 gradle-test/lib/
-rw-r--r--  0 0      0         684  1 Nov 00:44 gradle-test/lib/gradle-test.jar
drwxr-xr-x  0 0      0           0  1 Nov 00:51 gradle-test/var/
drwxr-xr-x  0 0      0           0  1 Nov 00:45 gradle-test/var/test/

如您所见,jar文件位于lib文件夹中,/var/具有所需的目录结构。希望这一点可以弄清楚。现在可能对您不起作用,因为您使用的是from createEmptyDirectories,但是它占用了createEmptyDirectories任务的 output 为空(mkdir不会将创建的目录添加到任务输出的位置)使用,所以您必须明确)