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