Gradle用于Java Playground的任务

5

我对Docker和Gradle还不太熟悉,但是我正在尝试设置一个Gradle构建来构建一个Docker镜像。

我刚刚完成了一个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来构建镜像。目前为止我对此感到满意。
通常我会创建一个临时类(例如Playground.java),其中包含一个可以运行和忽略的main方法。通常我只是在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 buildDocker时使用该任务来替换build,例如./gradlew playground buildDocker。这样做更实用吗?

1个回答

1
我建议你用Gradle项目属性替换硬编码的主类。
jar {
    manifest {
        attributes 'Main-Class': main
    }
}

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

main=com.myapp.Main

最后,当你需要构建使用运行 com.myapp.Playground 的jar的docker容器时,你可以使用以下命令调用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 的方法?例如,定义一个名为 playground 的任务,该任务使用 build 并在运行 build 之前更改 main - ordonezalex
此外,Docker 在第二次运行 ./gradlew build buildDocker 之前一直使用缓存的 COPY 层与应用程序。当我使用 -P 标志时也是如此。我还没有在 buildDocker 任务中使用 inputsoutputs 属性。为什么 Docker 第一次不会检测/反映这个变化? - ordonezalex
我编辑了我的回答,包括在任务中实现相同的事情。不幸的是,docker分层问题超出了这个问题和我的知识范围。这是一个gradle问题。 - Jordan Grant
由于某种原因,使用任务版本的解决方案时,分层问题不再存在。 - ordonezalex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接