Source From Here
OverviewSometimes, we want to execute various programs from Gradle that require input parameters. In this quick tutorial, we’re going to see how to pass command-line arguments from Gradle.
Types of Input Arguments
When we want to pass input arguments from the Gradle CLI, we have two choices:
In general, we should use project properties unless we want to customize settings in the JVM. Although it is possible to hijack system properties to pass our inputs, we should avoid doing this. Let's see these properties in action. First, we configure our build.gradle:
- apply plugin: "java"
- description = "Gradle Command Line Arguments examples"
- task propertyTypes(){
- doLast{
- if (project.hasProperty("args")) {
- println "Our input argument with project property ["+project.getProperty("args")+"]"
- }
- println "Our input argument with system property ["+System.getProperty("args")+"]"
- }
- }
We do this because of project.getProperty() throws a MissingPropertyException in case our property is not defined. Unlike project properties, System.getProperty() returns a null value in case the property is not defined. Next, let’s run the task and see its output:
Passing Command Line Arguments
So far, we’ve seen just how to read the properties. In practice, we need to send these properties as arguments to our program of choice.
Passing Arguments to Java Applications
In a previous tutorial, we explained how to run Java main classes from Gradle. Let’s build upon that and see how we can also pass arguments.
First, let’s use the application plugin in our build.gradle:
- apply plugin: "java"
- apply plugin: "application"
- description = "Gradle Command Line Arguments examples"
- // previous declarations
- ext.javaMainClass = "com.baeldung.cmd.MainClass"
- application {
- mainClassName = javaMainClass
- }
- src/Hello.java
- public class Hello{
- public static void main(String args[]){
- System.out.println("Gradle command line arguments example");
- for (String arg: args) {
- System.out.println("Got argument [" + arg + "]");
- }
- }
- }
Here, we don’t use properties to pass arguments. Instead, we pass the –args flag and the corresponding inputs there.
This is a nice wrapper provided by the application plugin. However, this is only available from Gradle 4.9 onward.
Let’s see what this would look like using a JavaExec task. First, we need to define it in our build.gradle:
ext.javaMainClass = "com.baeldung.cmd.MainClass"
- if (project.hasProperty("args")) {
- ext.cmdargs = project.getProperty("args")
- } else {
- ext.cmdargs = ""
- }
- task cmdLineJavaExec(type: JavaExec) {
- group = "Execution"
- description = "Run the main class with JavaExecTask"
- classpath = sourceSets.main.runtimeClasspath
- main = javaMainClass
- args cmdargs.split()
- }
Since this contains all the arguments as one string, we then use the split method to obtain an array of arguments. Next, we pass this array to the args property of our JavaExec task. Let’s see what happens when we run this task, passing project properties with the -P option:
Passing Arguments to Other Applications
In some cases, we might want to pass some arguments to a third-party application from Gradle. Luckily, we can use the more generic Exec task to do so:
- if (project.hasProperty("args")) {
- ext.cmdargs = project.getProperty("args")
- } else {
- ext.cmdargs = "ls"
- }
- task cmdLineExec(type: Exec) {
- group = "Execution"
- description = "Run an external program with ExecTask"
- commandLine cmdargs.split()
- }
Let’s see how to run this for the ls command:
Supplement
* Gradle: Running a jar file
沒有留言:
張貼留言