I am new to Gradle and managed to create a build file that works as intended:
- Generate SOAP-WS classes from a WSDL
- Build a Spring Boot application
I would love to hear some feedback about the build file itself, as I’m sure there are things that could be done easier and possibly improve build performance. This is the build.gradle I’m talking about, afterwards I’ll have some specific questions:
buildscript {
ext {
appName = 'webservice'
appVersion = '1.0.0-SNAPSHOT'
springBootVersion = '1.4.3.RELEASE'
cxfVersion = '3.1.9'
globalSourceCompatibility = 1.8
globalTargetCompatibility = 1.8
generatedSources = "${buildDir}/generated-sources/"
cxfOutputDir = "${generatedSources}/cxf"
resourcesDir = "src/main/resources"
wsdlDir = file("${resourcesDir}/wsdl")
bindingFile = file("${wsdlDir}/binding.xml")
}
repositories {
maven { url "https://plugins.gradle.org/m2/" }
mavenCentral()
}
dependencies {
classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}"
}
}
configurations {
cxfTool
}
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
version = appVersion
sourceSets {
main.java.srcDirs cxfOutputDir
}
task updateApplicationProperties {
doLast {
def configFile = new File('src/main/resources/application.yml')
println "updating version to '${appVersion}' in ${configFile}"
String configContent = configFile.getText('UTF-8')
configContent = configContent.replaceAll(/info:\n build:\n version: .*/, "info:\n build:\n version: ${appVersion}")
configFile.write(configContent, 'UTF-8')
}
}
task updateManifest {
doLast {
def ymlFiles = new FileNameByRegexFinder().getFileNames(".", /manifest.*\.yml/)
ymlFiles.each { String filePath ->
def manifest = new File(filePath)
println "updating ${manifest.name}"
String manifestContent = manifest.getText('UTF-8')
manifestContent = manifestContent.replaceAll(/ path: build\/libs\/.*\.jar/, " path: build/libs/${appName}-${appVersion}.jar")
manifest.write(manifestContent, 'UTF-8')
}
}
}
task wsdl2java(type: JavaExec) {
ext {
outputDir = file(cxfOutputDir)
wsdlFiles = new FileNameByRegexFinder().getFileNames("${wsdlDir}", /.*\.wsdl/)
}
wsdlFiles.each { String wsdlFile ->
outputs.upToDateWhen { false }
outputs.dir outputDir
main = 'org.apache.cxf.tools.wsdlto.WSDLToJava'
classpath = configurations.cxfTool
args '-d', outputDir
args '-b', bindingFile
args '-verbose'
args '-validate'
args wsdlFile
}
}
tasks.withType(JavaCompile) {
sourceCompatibility = globalSourceCompatibility
targetCompatibility = globalTargetCompatibility
dependsOn updateApplicationProperties
dependsOn updateManifest
dependsOn wsdl2java
}
jar {
baseName = "${appName}"
}
repositories {
mavenCentral()
}
dependencies {
compileOnly 'org.projectlombok:lombok:1.16.10'
compile 'org.springframework.cloud:spring-cloud-spring-service-connector'
compile 'org.springframework.cloud:spring-cloud-cloudfoundry-connector'
compile 'org.springframework.cloud:spring-cloud-starter-zipkin'
compile 'org.springframework.boot:spring-boot-starter-actuator'
compile 'org.springframework.boot:spring-boot-starter-data-jpa'
compile 'org.springframework.boot:spring-boot-starter-security'
compile 'org.springframework.boot:spring-boot-starter-web'
compile 'org.springframework.boot:spring-boot-starter-web-services'
compile 'org.springframework.boot:spring-boot-configuration-processor'
compile 'com.h2database:h2:1.4.192'
compile 'io.springfox:springfox-swagger2:2.6.0'
compile 'io.springfox:springfox-swagger-ui:2.6.0'
compile 'com.github.ulisesbocchio:jasypt-spring-boot-starter:1.8'
compile 'org.modelmapper:modelmapper:0.7.7'
compile 'io.prometheus:simpleclient:0.0.18'
compile 'io.prometheus:simpleclient_common:0.0.18'
compile 'io.prometheus:simpleclient_hotspot:0.0.18'
compile 'io.prometheus:simpleclient_servlet:0.0.18'
compile 'io.prometheus:simpleclient_pushgateway:0.0.18'
compile 'io.prometheus:simpleclient_spring_boot:0.0.18'
//compile group: 'org.apache.ws.commons.axiom', name: 'axiom-api', version: '1.2.20'
compile 'wsdl4j:wsdl4j:1.6.3'
testCompile 'org.springframework.boot:spring-boot-starter-test'
cxfTool "org.apache.cxf:cxf-tools-wsdlto-frontend-jaxws:$cxfVersion"
cxfTool "org.apache.cxf:cxf-tools-wsdlto-databinding-jaxb:$cxfVersion"
cxfTool "org.apache.cxf:cxf-tools-common:$cxfVersion"
cxfTool "org.apache.cxf:cxf-tools-wsdlto-core:$cxfVersion"
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:Camden.SR1"
}
}
More questions:
- Why are two “repositories” needed: One in ‘buildscript’ and one on root level?
- Should I use “compile group: …, name:…, version:…” instead of ‘group:name:version’?
- How could I manage to ensure updateApplicationProperties and updateManifest only run when the information change?
- Can I optimize the build file anyhow?
Thank you very much!