5 votes

Tâche Gradle pour le terrain de jeu Java

Je suis encore novice en matière de Docker et de Gradle, mais j'essaie de mettre en place un build Gradle qui construit une image Docker.

Je viens de terminer la mise en place d'un Dockerfile qui déploie et exécute localement le jar comme prévu. J'ai ceci dans mon 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
    }
}

Je cours ./gradlew build buildDocker pour construire l'image. J'en suis satisfait jusqu'à présent.

En général, je crée une classe jetable (par ex. Playground.java ) avec un main que je peux exécuter et ignorer. Habituellement, je l'exécute dans l'IDE, mais maintenant je voudrais pouvoir me connecter aux autres conteneurs Docker que je sais être en cours d'exécution.

Je sais que je pourrais essayer de modifier le sourceSets J'utilise en excluant com.myapp.Main mais j'imaginais qu'il pourrait y avoir une solution plus élégante qui ressemblerait à celle-ci :

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

Une autre approche pourrait être d'avoir une autre tâche que j'utilise pour remplacer la tâche build lorsque j'appelle ./gradlew build buildDocker , par exemple ./gradlew playground buildDocker . Est-ce plus pratique ?

1voto

Jordan Grant Points 690

Je suggérerais de remplacer votre classe principale codée en dur par une propriété de projet gradle.

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

Définissez cette propriété par défaut dans votre gradle.properties fichier.

main=com.myapp.Main

Enfin, lorsque vous devez construire votre conteneur docker qui utilise un jar exécutant com.myapp.Playground vous pouvez invoquer gradle avec :

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

Edit : Pour réaliser la même chose dans une tâche

project.ext.main = 'com.myapp.Main'

task play(){
    project.main = 'com.myapp.Playground'
    finalizedBy buildDocker
}

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X