java 编写可执cli 工具
像 presto 这样的框架提供了 presto-cli 这样的工具,使用java编写的.那么它是如何构建的呢.
1. pom.xml
<?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>
<groupId>org.java.common.cli</groupId>
<artifactId>example-cli</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<main-class>example.cli.Application</main-class>
</properties>
<dependencies>
<dependency>
<groupId>io.airlift</groupId>
<artifactId>airline</artifactId>
<version>0.8</version>
</dependency>
<dependency>
<groupId>io.airlift</groupId>
<artifactId>concurrent</artifactId>
<version>0.173</version>
</dependency>
<dependency>
<groupId>io.airlift</groupId>
<artifactId>log</artifactId>
<version>0.173</version>
</dependency>
<dependency>
<groupId>io.airlift</groupId>
<artifactId>log-manager</artifactId>
<version>0.173</version>
</dependency>
<dependency>
<groupId>io.airlift</groupId>
<artifactId>units</artifactId>
<version>1.3</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>21.0</version>
</dependency>
<dependency>
<groupId>jline</groupId>
<artifactId>jline</artifactId>
<version>2.14.6</version>
</dependency>
<dependency>
<groupId>io.airlift</groupId>
<artifactId>json</artifactId>
<version>0.173</version>
</dependency>
</dependencies>
<build>
<plugins>
<!--打包成可执行的jar-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>executable</shadedClassifierName>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Main-Class>${main-class}</Main-Class>
</manifestEntries>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.skife.maven</groupId>
<artifactId>really-executable-jar-maven-plugin</artifactId>
<configuration>
<flags>-Xmx1G</flags>
<classifier>executable</classifier>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>really-executable-jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
2. 启动程序
public class Application {
Application() {
}
public static void main(String[] args) {
Console console = singleCommand(Console.class).parse(args);
if (console.helpOption.showHelpIfRequested() ||
console.versionOption.showVersionIfRequested()) {
return;
}
System.exit(console.run() ? 0 : 1);
}
}
3. ClientOption
public class ClientOptions {
@Option(name = {"-s", "--server"}, title = "server", description = " server location (default: localhost:8080)")
public String server = "localhost:8080";
@Option(name = {"-u", "--user"}, title = "user", description = "Username")
public String user = System.getProperty("user.name");
@Option(name = {"-p", "--password"}, title = "password", description = "Prompt for password")
public boolean password;
public String getServer() {
return server;
}
public void setServer(String server) {
this.server = server;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public boolean isPassword() {
return password;
}
public void setPassword(boolean password) {
this.password = password;
}
}
4. Consle
@Command(name = "app", description = "app interactive console")
public class Console {
@Inject // javax.inject
public HelpOption helpOption;
@Inject
public VersionOption versionOption = new VersionOption();
@Inject
public ClientOptions clientOptions = new ClientOptions();
public boolean run() {
System.out.println(clientOptions.getServer());
return true;
}
}
5. VersionOption
public class VersionOption {
@Option(name = "--version", description = "Display version information and exit")
public Boolean version = false;
public boolean showVersionIfRequested() {
if (version) {
System.out.println("app CLI 1.0 ");
}
return version;
}
}
6. 执行mvn clean install 生成 example-cli-1.0-SNAPSHOT-executable.jar 重名下 mv example-cli-1.0-SNAPSHOT-executable.jar app
7. 测试
./app --version
./app --help
./app -s=127.0.0.1 -u root
可以配合使用 jline 就可以交互式的Java 命令行了 类似于 Jshell .