Java操场的Gradle任务

我对Docker和Gradle还是个新手,但是我正在尝试设置一个构buildDocker镜像的Gradle构build。

我刚刚完成了一个Dockerfile设置,这个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来构build图像。 我对此感到高兴。

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

我知道我可以尝试通过排除com.myapp.Main来改变我使用的com.myapp.Main ,但是我想象着可能会有一个更优雅的解决scheme:

 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时使用另一个任务来replacebuild ,例如./gradlew playground buildDocker 。 这更实用吗?

我build议用gradle项目属性来replace硬编码的主类。

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

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

 main=com.myapp.Main 

最后,当您需要构build使用运行com.myapp.Playground的jar的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 } }