代码之家  ›  专栏  ›  技术社区  ›  ordonezalex

Java操场分级任务

  •  5
  • ordonezalex  · 技术社区  · 10 年前

    我刚完成设置 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容器。

    sourceSets 我正在使用排除 com.myapp.Main ,但我想可能会有一个更优雅的解决方案,类似于:

    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
        }
    }
    

    另一种方法可能是使用另一个任务来替换 build 当我打电话时 ./gradlew构建buildDocker ,例如。 ./gradlew playground buildDocker

    1 回复  |  直到 10 年前
        1
  •  1
  •   Jordan Grant    10 年前

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

    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
        }
    }