I'm trying to achieve a simple scenario in my spring boot project build: including / excluding dependencies and packaging war or jar depending on the environment.
So for example, for the environment dev
include devtools and package jar, for prod
package war etc.
I know it is not XML based configuration anymore and I can basically write if statements in my build.gradle but is there a recommended way of achieving this?
Can I declare some common dependencies and refer them in a single file instead of creating multiple build files?
Is there a best practice changing build configuration based on the build target environment?
Gradle is based on a graph of task dependencies – in which tasks are the things that do the work – while Maven is based on a fixed and linear model of phases. With Maven, goals are attached to project phases, and goals serve a similar function to Gradle's tasks, being the “things that do the work.”
A Build profile is a set of configuration values, which can be used to set or override default values of Maven build. Using a build profile, you can customize build for different environments such as Production v/s Development environments. Profiles are specified in pom.
The biggest differences are Gradle's mechanisms for work avoidance and incrementality. The top 3 features that make Gradle much faster than Maven are: Incrementality — Gradle avoids work by tracking input and output of tasks and only running what is necessary, and only processing files that changed when possible.
What is Gradle? Gradle is a build automation system that is fully open source and uses the concepts you see on Apache Maven and Apache Ant. It uses domain-specific language based on the programming language Groovy, differentiating it from Apache Maven, which uses XML for its project configuration.
ext { devDependencies = ['org.foo:dep1:1.0', 'org.foo:dep2:1.0'] prodDependencies = ['org.foo:dep3:1.0', 'org.foo:dep4:1.0'] isProd = System.properties['env'] == 'prod' isDev = System.properties['env'] == 'dev' } apply plugin: 'java' dependencies { compile 'org.foo:common:1.0' if (isProd) { compile prodDependencies } if (isDev) { compile devDependencies } } if (isDev) tasks.withType(War).all { it.enabled = false }
My version (inspired by Lance Java's answer):
apply plugin: 'war' ext { devDependencies = { compile 'org.foo:dep1:1.0', { exclude module: 'submodule' } runtime 'org.foo:dep2:1.0' } prodDependencies = { compile 'org.foo:dep1:1.1' } commonDependencies = { compileOnly 'javax.servlet:javax.servlet-api:3.0.1' } env = findProperty('env') ?: 'dev' } dependencies project."${env}Dependencies" dependencies project.commonDependencies if (env == 'dev') { war.enabled = false }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With