【问题标题】:Gradle task for Java playgroundJava Playground 的 Gradle 任务
【发布时间】:2016-07-29 19:10:07
【问题描述】:

我仍然是 Docker 和 Gradle 的新手,但我正在尝试设置一个构建 Docker 映像的 Gradle 构建。

我刚刚完成了 Dockerfile 的设置,它可以按预期在本地部署和运行 jar。我的build.gradle 中有这个:

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'se.transmode.gradle:gradle-docker:1.2'
    }
}

plugins {
    id 'com.github.johnrengelman.shadow' version '1.2.3'
}

apply plugin: 'docker'

jar {
    manifest {
        attributes 'Main-Class': 'com.myapp.Main'
    }
}


task buildDocker(type: Docker, dependsOn: shadowJar) {
    push = false

    applicationName = jar.baseName

    tagVersion = 'latest'
    dockerfile = file('src/main/docker/Dockerfile')

    copy {
        from shadowJar
        into stageDir
    }
}

我运行./gradlew build buildDocker 来构建映像。到目前为止,我对此感到满意。

通常我会使用 main 方法创建一个一次性类(例如 Playground.java),我可以运行并忽略它。通常我只是在 IDE 中运行它,但现在我希望能够连接到我知道将运行的其他 Docker 容器。

我知道我可以尝试通过排除com.myapp.Main 来更改我正在使用的sourceSets,但我想可能会有一个更优雅的解决方案,类似于这样:

task buildDockerPlayground(type: Docker, dependsOn: shadowJar) {
    main = 'com.myapp.Playground'

    push = false

    applicationName = jar.baseName

    tagVersion = 'latest'
    dockerfile = file('src/main/docker/Dockerfile')

    copy {
        from shadowJar
        into stageDir
    }
}

另一种方法可能是在我调用./gradlew build buildDocker 时使用另一个任务来替换build,例如./gradlew playground buildDocker。这样更实用吗?

【问题讨论】:

    标签: java gradle docker


    【解决方案1】:

    我建议用 gradle 项目属性替换硬编码的主类。

    jar {
        manifest {
            attributes 'Main-Class': main
        }
    }
    

    在您的 gradle.properties 文件中设置该默认属性。

    main=com.myapp.Main
    

    最后,当您需要构建使用 jar 运行的 docker 容器时 com.myapp.Playground 你可以调用 gradle:

    ./gradlew buildDocker -Pmain=com.myapp.Playground
    

    编辑:在一个任务中完成同样的事情

    project.ext.main = 'com.myapp.Main'
    
    task play(){
        project.main = 'com.myapp.Playground'
        finalizedBy buildDocker
    }
    
    jar {
        manifest {
            attributes 'Main-Class': project.main
        }
    }
    

    【讨论】:

    • 我喜欢删除硬编码属性的建议。有没有办法通过任务设置main?例如,定义一个使用build 并在运行build 之前更改main 的任务playground 的方法?
    • 另外,docker 正在使用缓存的COPY 层和应用程序,直到我第二次运行./gradlew build buildDocker。这同样适用于我使用 -P 标志时。我还没有在buildDocker 任务中使用inputsoutputs 属性。为什么 Docker 第一次无法检测/反映这种变化?
    • 我编辑了我的答案,包括在任务中实现相同的目标。不幸的是,码头工人分层问题超出了这个问题和我的知识范围。这是一个 gradle 问题。
    • 由于某种原因,解决方案的任务版本不再存在分层问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 2018-09-27
    相关资源
    最近更新 更多