Merge pull request #6783 from FDPro/bael-2882
dupirefr/dupire.francois+pro@gmail.com [BAEL-2882] Create a Command Line Java Program with Picocli
This commit is contained in:
commit
c80d0a9e84
|
@ -0,0 +1,28 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>parent-java</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<relativePath>../parent-java</relativePath>
|
||||
</parent>
|
||||
|
||||
<artifactId>picocli</artifactId>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>info.picocli</groupId>
|
||||
<artifactId>picocli</artifactId>
|
||||
<version>3.9.6</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter</artifactId>
|
||||
<version>2.1.4.RELEASE</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
|
@ -0,0 +1,41 @@
|
|||
package com.baeldung.picocli.git;
|
||||
|
||||
import com.baeldung.picocli.git.commands.programmative.GitCommand;
|
||||
import com.baeldung.picocli.git.commands.subcommands.GitAddCommand;
|
||||
import com.baeldung.picocli.git.commands.subcommands.GitCommitCommand;
|
||||
import com.baeldung.picocli.git.commands.subcommands.GitConfigCommand;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.CommandLineRunner;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import picocli.CommandLine;
|
||||
|
||||
@SpringBootApplication
|
||||
public class Application implements CommandLineRunner {
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(Application.class, args);
|
||||
}
|
||||
|
||||
private GitCommand gitCommand;
|
||||
private GitAddCommand addCommand;
|
||||
private GitCommitCommand commitCommand;
|
||||
private GitConfigCommand configCommand;
|
||||
|
||||
@Autowired
|
||||
public Application(GitCommand gitCommand, GitAddCommand addCommand, GitCommitCommand commitCommand, GitConfigCommand configCommand) {
|
||||
this.gitCommand = gitCommand;
|
||||
this.addCommand = addCommand;
|
||||
this.commitCommand = commitCommand;
|
||||
this.configCommand = configCommand;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run(String... args) {
|
||||
CommandLine commandLine = new CommandLine(gitCommand);
|
||||
commandLine.addSubcommand("add", addCommand);
|
||||
commandLine.addSubcommand("commit", commitCommand);
|
||||
commandLine.addSubcommand("config", configCommand);
|
||||
|
||||
commandLine.parseWithHandler(new CommandLine.RunLast(), args);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
package com.baeldung.picocli.git.commands.declarative;
|
||||
|
||||
import com.baeldung.picocli.git.model.ConfigElement;
|
||||
import com.baeldung.picocli.git.commands.subcommands.GitAddCommand;
|
||||
import com.baeldung.picocli.git.commands.subcommands.GitCommitCommand;
|
||||
import com.baeldung.picocli.git.commands.subcommands.GitConfigCommand;
|
||||
import picocli.CommandLine;
|
||||
|
||||
import static picocli.CommandLine.*;
|
||||
import static picocli.CommandLine.Command;
|
||||
|
||||
@Command(
|
||||
name = "git",
|
||||
subcommands = {
|
||||
GitAddCommand.class,
|
||||
GitCommitCommand.class,
|
||||
GitConfigCommand.class
|
||||
}
|
||||
)
|
||||
public class GitCommand implements Runnable {
|
||||
public static void main(String[] args) {
|
||||
CommandLine commandLine = new CommandLine(new GitCommand());
|
||||
commandLine.registerConverter(ConfigElement.class, ConfigElement::from);
|
||||
|
||||
commandLine.parseWithHandler(new RunLast(), args);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
System.out.println("The popular git command");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
package com.baeldung.picocli.git.commands.methods;
|
||||
|
||||
import picocli.CommandLine;
|
||||
|
||||
import static picocli.CommandLine.Command;
|
||||
|
||||
@Command(name = "git")
|
||||
public class GitCommand implements Runnable {
|
||||
public static void main(String[] args) {
|
||||
CommandLine.run(new GitCommand(), args);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
System.out.println("The popular git command");
|
||||
}
|
||||
|
||||
@Command(name = "add")
|
||||
public void addCommand() {
|
||||
System.out.println("Adding some files to the staging area");
|
||||
}
|
||||
|
||||
@Command(name = "commit")
|
||||
public void commitCommand() {
|
||||
System.out.println("Committing files in the staging area, how wonderful?");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
package com.baeldung.picocli.git.commands.programmative;
|
||||
|
||||
import com.baeldung.picocli.git.commands.subcommands.GitAddCommand;
|
||||
import com.baeldung.picocli.git.commands.subcommands.GitCommitCommand;
|
||||
import org.springframework.stereotype.Component;
|
||||
import picocli.CommandLine;
|
||||
|
||||
import static picocli.CommandLine.Command;
|
||||
import static picocli.CommandLine.RunLast;
|
||||
|
||||
@Command(name = "git")
|
||||
@Component
|
||||
public class GitCommand implements Runnable {
|
||||
public static void main(String[] args) {
|
||||
CommandLine commandLine = new CommandLine(new GitCommand());
|
||||
commandLine.addSubcommand("add", new GitAddCommand());
|
||||
commandLine.addSubcommand("commit", new GitCommitCommand());
|
||||
|
||||
commandLine.parseWithHandler(new RunLast(), args);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
System.out.println("The popular git command");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
package com.baeldung.picocli.git.commands.subcommands;
|
||||
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.nio.file.Path;
|
||||
import java.util.List;
|
||||
|
||||
import static picocli.CommandLine.*;
|
||||
|
||||
@Command(
|
||||
name = "add"
|
||||
)
|
||||
@Component
|
||||
public class GitAddCommand implements Runnable {
|
||||
@Option(names = "-A")
|
||||
private boolean allFiles;
|
||||
|
||||
@Parameters(index = "0..*")
|
||||
private List<Path> files;
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
if (allFiles) {
|
||||
System.out.println("Adding all files to the staging area");
|
||||
}
|
||||
|
||||
if (files != null) {
|
||||
files.forEach(path -> System.out.println("Adding " + path + " to the staging area"));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
package com.baeldung.picocli.git.commands.subcommands;
|
||||
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import static picocli.CommandLine.Command;
|
||||
import static picocli.CommandLine.Option;
|
||||
|
||||
@Command(
|
||||
name = "commit"
|
||||
)
|
||||
@Component
|
||||
public class GitCommitCommand implements Runnable {
|
||||
@Option(names = {"-m", "--message"}, required = true)
|
||||
private String[] messages;
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
System.out.println("Committing files in the staging area, how wonderful?");
|
||||
if (messages != null) {
|
||||
System.out.println("The commit message is");
|
||||
for (String message : messages) {
|
||||
System.out.println(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
package com.baeldung.picocli.git.commands.subcommands;
|
||||
|
||||
import com.baeldung.picocli.git.model.ConfigElement;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import static picocli.CommandLine.Command;
|
||||
import static picocli.CommandLine.Parameters;
|
||||
|
||||
@Command(
|
||||
name = "config"
|
||||
)
|
||||
@Component
|
||||
public class GitConfigCommand implements Runnable {
|
||||
@Parameters(index = "0")
|
||||
private ConfigElement element;
|
||||
|
||||
@Parameters(index = "1")
|
||||
private String value;
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
System.out.println("Setting " + element.value() + " to " + value);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
package com.baeldung.picocli.git.model;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
public enum ConfigElement {
|
||||
USERNAME("user.name"),
|
||||
EMAIL("user.email");
|
||||
|
||||
private final String value;
|
||||
|
||||
ConfigElement(String value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public String value() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public static ConfigElement from(String value) {
|
||||
return Arrays.stream(values())
|
||||
.filter(element -> element.value.equals(value))
|
||||
.findFirst()
|
||||
.orElseThrow(() -> new IllegalArgumentException("The argument " + value + " doesn't match any ConfigElement"));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
package com.baeldung.picocli.helloworld;
|
||||
|
||||
import picocli.CommandLine;
|
||||
|
||||
import static picocli.CommandLine.Command;
|
||||
|
||||
@Command(
|
||||
name = "hello",
|
||||
description = "Says hello"
|
||||
)
|
||||
public class HelloWorldCommand implements Runnable {
|
||||
public static void main(String[] args) {
|
||||
CommandLine.run(new HelloWorldCommand(), args);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
System.out.println("Hello World!");
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue